Ułamki w systemie binarnym – jak to działa?
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ą:
Zadanie takie wykonamy, dzieląc wielokrotnie liczbę 19 przez 2 i zapisując resztę pozostałą po operacji.

Dzielnik ma wartość 2, ponieważ taka jest bazabaza (podstawa) docelowego systemu liczbowego. Prześledźmy wykonywane czynności.
Liczbę 19 dzielimy przez 2; zapisujemy całkowitą część wyniku (czyli 9) i resztę z dzielenia (wynosi ona 1).
Dzielimy przez 2 część całkowitą z poprzedniej operacji (9). Po raz kolejny zapamiętujemy iloraz (4) i resztę (ponownie wynosi ona 1).
Znowu dzielimy ostatni otrzymany iloraz przez 2, zapamiętując część całkowitą wyniku i resztę.
Powtarzamy przedstawione operacje do momentu, w którym iloraz wyniesie zero.
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.
Otrzymujemy wynik:
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 binarnymsystemie binarnym. Wykorzystamy strumień wejścia cin:
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:
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():
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:
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.

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:
Mnożymy liczbę 0,1928 przez 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.
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.
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:
#include <iostream>
#include <string>
using namespace std;
int main() {
int liczba;
cout << „Podaj liczbę całkowitą dodatnią: „;
cin >> liczba;
if (liczba <= 0) {
cout << „Liczba musi być dodatnia.” << endl;
return 1;
}
string binarny = „”;
// Algorytm konwersji: dzielenie przez 2 i zbieranie reszt
while (liczba > 0) {
int reszta = liczba % 2;
binarny = to_string(reszta) + binarny; // dodajemy na początek
liczba /= 2;
}
cout << „Zapis binarny: „ << binarny << endl;
return 0;
}#include
int main() { int liczba; cout << „Podaj liczbę całkowitą dodatnią: „; cin >> liczba;
}
Słownik
inna nazwa systemu dwójkowego (czyli systemu liczbowego o podstawie 2), w którym wykorzystywane są tylko cyfry 1 i 0
synonim podstawy pozycyjnego systemu liczbowego; przykładowo, bazą systemu ósemkowego jest liczba 8