[C++] Zamiana dziesietnego na binarny


(crimlee) #1

Witam

Chce napisac program ktopry ebdzie zamienial dowolna liczbe w systemei dziesietnym na lcizbe w systemie binarnym. Zrobilem cos takiego

ale wyniki wychodz膮 w odwrotna straone, czyli zamiast 1000 wychodzi 0001

Jak temu zaradzic? moze powinienem sbudowac program w jakis inny sposob?

Jesli mozecie mi pomoc to bylbym wdzieczny :slight_smile: Chodzi mi tylko o nakierowanie, nie interesuja mnei gotowe rozwiazania :stuck_out_tongue:

main()

{

int podana_liczba,b;


cout << "podaj liczbe do przeliczenia" << endl;

cin >> podana_liczba;


 for (podana_liczba ; podana_liczba >= 1 ; podana_liczba=podana_liczba/2)

    {

     if (podana_liczba%2)

         cout << "1";

     else cout << "0";

     }

cout << endl;

cin >> b;


}

od razu mowie ze zmienna b jest tylko po to zeby sie program nie wylaczal od razu


(Airborn) #2

ja tam nie wiem na ile to optymalne rozwi膮zanie czy poprawne, ale ja zrobi艂 bym 32 elementow膮 tablic臋, kolejne 0 czy 1 wpisywa艂 do niej zamiast wypisywa膰 na ekran, a nast臋pnie odczyta艂 t臋 tablic臋 od ty艂u


(crimlee) #3

heh czyli to zadanie jest trudniejsze niz przypuszczalem:) zapomnaielm dodac ze jestem poczatkujacy w tej branzy :stuck_out_tongue:

a z tego co mi wyszlo da sie jeszcze zmodyfikowac jakos zeby zapisywalo w odwratn膮 strone??


(Airborn) #4

samo dodawanie do tablicy mo偶na doda膰 w tym co ju偶 masz, wy艣wietlanie ca艂ej tablicy wymaga艂o by dodanie jeszcze jednej p臋tli for


(crimlee) #5

no dobra:) dzieki za nakierowanie:) reszta sprobuje sie sam zaj膮膰 :slight_smile:


(Ryan) #6

Je艣li chcesz tylko wy艣wietli膰 warto艣膰, to ca艂y kod ma 4 linijki i nie potrzeba tablicy. Cho膰 tak po prawdzie to nic nie trzeba pisa膰, bo s膮 odpowiednie biblioteki od tego. Przyk艂adowy kod:

#include 


void main(void)

{

	unsigned long int ulLiczba = 123456;

	unsigned long int ulFlaga = 1 << (sizeof(ulLiczba) * 8 - 1);

	for(; ulFlaga > 0; ulFlaga >>= 1)

		printf("%d", ulLiczba & ulFlaga ? 1 : 0);

}

Zasada dzia艂ania jest bardzo prosta. Wyja艣ni臋 poszczeg贸lne fragmenty kodu. - ulLiczba przechowuje warto艣膰, kt贸r膮 chcesz wy艣wietli膰 binarnie; je艣li potrzebujesz j膮 wczyta膰 z klawiatury, ci膮g na warto艣膰 mo偶esz zmieni膰 przy pomocy atoi / atol /atof (zale偶y jakiego typu ma by膰 warto艣膰) - ulFlaga przechowuje flag臋 maskuj膮c膮 jeden bit;

ulFlaga = 1

[00000000|00000000|00000000|00000001]

sizeof(ulLiczba) == 4, bo ulLiczba to unsigned long int przechowywany w 4 bajtach

4 * 8 == 32, czyli ilo艣膰 bit贸w przechowywanych w zmiennej typu unsigned long

32 - 1 == 31, czyli o ile bit贸w w lewo nale偶y przesun膮膰 warto艣膰 z ulFlaga, np:

ulFlaga = 1 << 2 to

[00000000|00000000|00000000|00000100]

ulFlaga = 1 << 8 to

[00000000|00000000|00000001|00000000]


ulFlaga = 1 << 31 to

[10000000|00000000|00000000|00000000]
  • z ka偶dym cyklem p臋tli for 1 przesuwany w prawo o jeden bit; w ostatnim kroku jedynk臋 przesuniemy z najm艂odszego bitu poza warto艣膰, kt贸r膮 mo偶na zareprezentowa膰 przy pomocy unsigned long int a zatem ulFlaga przyjmie warto艣膰 0 i p臋tla zako艅czy si臋 - maskuj膮c warto艣膰 ulLiczba z ulFlaga sprawdzamy, czy w danym miejscu znajduje si臋 jedynka, np:

    [10001100|10001110|00100000|00000110] ulLiczba

    &

    [00000000|00001000|00000000|00000000] ulFlaga

    ==

    [00000000|00001000|00000000|00000000] ulFlaga & ulLiczba

    ulFlaga & ulLiczba != 0, wi臋c ulFlaga & ulLiczba = true

Pro艣ciej? U偶y膰 itoa lub ltoa, kt贸re przyjmuje baz臋 systemu liczbowego. Warto si臋 jednak zastanowi膰 jak du偶y bufor jest potrzebny do wykorzystania tej funkcji.