Konwersja części całkowitej liczby

Przypomnijmy sobie algorytm konwersji liczb zapisanych w postaci dziesiętnej do ich dwójkowych odpowiedników.

Zamienimy liczbę 19 na postać dwójkową:

19(10)()(2)

Zadanie takie wykonamy, dzieląc wielokrotnie liczbę 19 przez 2 i zapisując resztę pozostałą po operacji.

R1ef1t5MAoW78
Kolejne etapy przekształcania liczby zapisanej w systemie dziesiętnym do postaci dwójkowej
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Dzielnik ma wartość 2, ponieważ taka jest bazabazabaza (podstawa) docelowego systemu liczbowego. Prześledźmy wykonywane czynności.

  1. Liczbę 19 dzielimy przez 2; zapisujemy całkowitą część wyniku (czyli 9) i resztę z dzielenia (wynosi ona 1).

  2. Dzielimy przez 2 część całkowitą z poprzedniej operacji (9). Po raz kolejny zapamiętujemy iloraz (4) i resztę (ponownie wynosi ona 1).

  3. Znowu dzielimy ostatni otrzymany iloraz przez 2, zapamiętując część całkowitą wyniku i resztę.

  4. Powtarzamy przedstawione operacje do momentu, w którym iloraz wyniesie zero.

  5. Otrzymane w kolejnych etapach reszty z dzielenia, ustawione w kolejności od ostatniej do pierwszej, składają się na dwójkową postać przekształcanej liczby. Na rysunku zaznaczyliśmy reszty kolorem czerwonym. Cyfry składające się na wynik odczytujemy od dołu do góry, tak jak pokazuje strzałka.

  6. Otrzymujemy wynik:

19(10)=10011(2)

Zajmijmy się teraz zapisaniem algorytmu w języku C++.

Algorytm konwersji w języku C++

Pisząc w języku C++ program dokonujący konwersji liczby dziesiętnej do postaci binarnej, wykorzystamy:

  • samodzielnie zdefiniowaną funkcję – będzie ona odpowiadać za cały proces zmiany postaci liczby;

  • strumienie wejścia/wyjścia – użytkownik poda dzięki nim liczbę przeznaczoną do zapisania w postaci dwójkowej, a później zobaczy wynik działania programu;

  • funkcje wbudowane języka C++ – posłużymy się nimi podczas przekształcania liczby i prezentacji rezultatów.

Najpierw pozwolimy użytkownikowi podać liczbę przeznaczoną do zapisania w systemie binarnymsystem binarnysystemie binarnym. Wykorzystamy strumień wejścia cin:

Linia 1. int liczba podkreślnik dec średnik. Linia 3. std dwukropek dwukropek cin zamknij nawias ostrokątny zamknij nawias ostrokątny liczba podkreślnik dec średnik.

W tej części kodu definiujemy zmienną całkowitą liczba_dec. Przyjmie ona wartość liczby, którą wpisał użytkownik.

Następnie deklarujemy funkcję o nazwie konwertuj(). Właśnie ona zajmie się zamianą postaci liczby:

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 3. std dwukropek dwukropek string konwertuj otwórz nawias okrągły int liczba zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. zamknij nawias klamrowy.

Jako argument funkcja przyjmie liczbę całkowitą, natomiast zwróci ciąg znaków (obiekt typu string). Decydujemy się na taki właśnie typ danych ze względu na wygodę. Łańcucha znaków będzie nam po prostu łatwo używać.

Pamiętajmy, że proces konwersji polega na „sklejaniu” w całość kolejnych liczb będących resztami z dzielenia przekształcanej liczby przez 2. Język C++ pozwala wykonywać takie zadania bardzo łatwo, kiedy operuje się na łańcuchach znaków.

Liczbę w postaci dwójkowej przedstawimy jako ciąg znaków o nazwie bin. Początkowo będzie on pusty, ale wraz z każdym cyklem dzielenia dopiszemy do niego wartość 0 lub 1 (czyli kolejne reszty). W przypadku obiektów typu string podczas „doklejania” elementów do końca ciągu używa się zwykłego operatora dodawania.

W końcowej fazie działania programu wyświetlimy zmienną bin wspak (podobnie jak w zapisie ręcznym podawaliśmy wynik od dołu do góry). Również taką operację przeprowadza się na ciągach znaków bardzo łatwo.

Dopiszmy zatem niezbędne instrukcje w ciele funkcji konwertuj():

Linia 1. std dwukropek dwukropek string konwertuj otwórz nawias okrągły int liczba zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. std dwukropek dwukropek string bin znak równości cudzysłów cudzysłów średnik. Linia 3. int reszta znak równości 0 średnik. Linia 5. while otwórz nawias okrągły liczba zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. reszta znak równości liczba procent 2 średnik. Linia 7. liczba znak równości liczba prawy ukośnik 2 średnik. Linia 8. bin znak równości bin plus std dwukropek dwukropek to podkreślnik string otwórz nawias okrągły reszta zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy. Linia 11. std dwukropek dwukropek string bin podkreślnik result znak równości cudzysłów cudzysłów średnik. Linia 13. for otwórz nawias okrągły int i znak równości bin kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. bin podkreślnik result plus znak równości bin otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 15. zamknij nawias klamrowy. Linia 17. return bin podkreślnik result średnik. Linia 18. zamknij nawias klamrowy.

Zauważ, że w programie użyliśmy funkcji wbudowanej to_string(). Musimy się nią posłużyć, aby uniknąć błędów podczas kompilacji.

Zmienna bin jest typu string, dopisujemy do niej („doklejamy”) zmienną typu całkowitego reszta. Aby je połączyć, nie wolno tak po prostu użyć znaku dodawania. Oznaczałoby to próbę arytmetycznego dodania liczby 0 lub 1 do ciągu znaków. Kompilator nie pozwoli tego zrobić ze względu na niezgodność typów danych.

Właśnie dlatego sięgnęliśmy po funkcję to_string(). Przekształca ona typ zmiennej reszta w ciąg znaków (string). W efekcie możemy skorzystać z operatora + aby dopisać 0 lub 1 na końcu ciągu bin.

W ostatniej pętli zapisujemy w zmiennej bin_result ciąg znaków bin w kolejności od ostatniego do pierwszego, a rezultat wyświetlamy na ekranie.

Oto cały program dokonujący konwersji liczby zapisanej w systemie dziesiętnym do postaci binarnej:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 4. std dwukropek dwukropek string konwertuj otwórz nawias okrągły int liczba zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. std dwukropek dwukropek string bin znak równości cudzysłów cudzysłów średnik. Linia 6. int reszta znak równości 0 średnik. Linia 8. while otwórz nawias okrągły liczba zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. reszta znak równości liczba procent 2 średnik. Linia 10. liczba znak równości liczba prawy ukośnik 2 średnik. Linia 11. bin znak równości bin plus std dwukropek dwukropek to podkreślnik string otwórz nawias okrągły reszta zamknij nawias okrągły średnik. Linia 12. zamknij nawias klamrowy. Linia 14. std dwukropek dwukropek string bin podkreślnik result znak równości cudzysłów cudzysłów średnik. Linia 16. for otwórz nawias okrągły int i znak równości bin kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. bin podkreślnik result plus znak równości bin otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 18. zamknij nawias klamrowy. Linia 20. return bin podkreślnik result średnik. Linia 21. zamknij nawias klamrowy. Linia 24. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. int liczba podkreślnik dec średnik. Linia 27. std dwukropek dwukropek cin zamknij nawias ostrokątny zamknij nawias ostrokątny liczba podkreślnik dec średnik. Linia 28. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny konwertuj otwórz nawias okrągły liczba podkreślnik dec zamknij nawias okrągły średnik. Linia 30. return 0 średnik. Linia 31. zamknij nawias klamrowy.

Konwersja części ułamkowej

W przypadku konwersji części ułamkowej z systemu dziesiętnego do postaci binarnej będziemy postępować inaczej niż podczas przekształcania części całkowitej.

Jeszcze raz posłużymy się przykładem. Zapiszemy liczbę 0,1928 w postaci dwójkowej.

0,1928(10)()(2)
R1RCoVq8e3mi1
Przekształcanie części ułamkowej liczby do postaci binarnej
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym przypadku wielokrotnie mnożymy część ułamkową przez liczbę 2 (czyli podstawę systemu dwójkowego) i sprawdzamy, czy iloczyn jest większy niż 1.

Wróćmy do przykładu:

  1. Mnożymy liczbę 0,1928 przez 2.

  2. Sprawdzamy wartość iloczynu:

    • jeżeli jest ona większa niż 1, przypisujemy cyfrze części ułamkowej wartość 1;

    • jeżeli jest ona mniejsza niż 1, przypisujemy cyfrze części ułamkowej wartość 0.

  3. Jeżeli iloczyn był większy od jedności, odejmujemy od niego 1 (tak, aby została tylko część ułamkowa); w sytuacji, gdy iloczyn był mniejszy niż 1, pozostawiamy go w postaci niezmienionej.

  4. Wracamy do punktu 1.; tym razem jako część ułamkową podstawiamy wartość otrzymaną w punkcie 3.

Kolejne cyfry części ułamkowej poznajemy w punkcie 2. przedstawionego algorytmu. Tym razem jednak odczytujemy je nie wspak (jak w przypadku konwersji części całkowitej), lecz  wprost – od góry do dołu. A zatem:

0,1928(10)(0,00110)(2)

Słownik

system binarny
system binarny

inna nazwa systemu dwójkowego (czyli systemu liczbowego o podstawie 2), w którym wykorzystywane są tylko cyfry 1 i 0

baza
baza

synonim podstawy pozycyjnego systemu liczbowego; przykładowo, bazą systemu ósemkowego jest liczba 8