Podobnie jak w przypadku różnych języków na przestrzeni lat powstawały różne systemy liczbowe. Najbardziej znany i codziennie wykorzystywany jest dziesiętny system liczbowy, a więc taki, w którym do zapisywania liczb używamy 10 różnych cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Jest to jeden z wielu systemów pozycyjnych, czyli metod zapisywania liczb tak, by pozycja cyfry w ciągu oznaczała wielokrotność potęgi liczby będącej podstawąpodstawa systemu liczbowegopodstawą tego systemu. W przypadku dziesiętnego systemu liczbowego (ang. decimal numeral system) podstawą jest liczba 10, w związku z tym zapis „153” otrzymujemy obliczając sumę wartości na kolejnych pozycjach:

1102+5101+3100=100+50+3=153

System dziesiętny a dwójkowy

Systemem używanym powszechnie w informatyce jest dwójkowy system liczbowy, nazywany również binarnym. Podobnie jak system dziesiętny, jest on systemem pozycyjnym. Do zapisania każdej liczby w tym systemie możemy użyć tylko dwóch cyfr: 0 i 1, a podstawą jest liczba 2.

Jak w takim razie zinterpretować „153” w systemie binarnym, skoro do dyspozycji mamy tylko dwie cyfry 0 i 1?

Musimy dokonać konwersji tej liczby pomiędzy dwoma systemami. Taką operację możemy porównać do tłumaczenia słowa z jednego języka na inny.

Ważne!

Podczas pracy z różnymi systemami liczbowymi łatwo się pomylić, dlatego często obok liczby zapisuje się, w jakim systemie jest ona zapisana. Przykładowo 10 w systemie dziesiętnym oznacza zupełnie inną liczbę w systemie dwójkowym.

10(10)10(2)

Funkcje wbudowane

Większość języków programowania posiada gotowe funkcje do przeprowadzania konwersji pomiędzy różnymi systemami liczbowymi. W języku Python możemy wykorzystać wbudowaną funkcję bin( ).

Wykorzystaj kod napisany poniżej i sprawdź, jakie wyniki otrzymasz dla różnych liczb.

Linia 1. n znak równości 153 kratka Do zmiennej n przypisz liczbę 153. Linia 2. print otwórz nawias okrągły bin otwórz nawias okrągły n zamknij nawias okrągły zamknij nawias okrągły kratka Zapisz i wydrukuj liczbę w postaci binarnej.
Ważne!

Python, tak jak wiele innych języków, używa prefiksów do oznaczania systemów liczbowych innych niż dziesiętne, dlatego wynik podany w systemie binarnym zawsze zaczyna się od znaków „0b”.

Wiemy już zatem, jak zaprezentować naszą liczbę w systemie binarnym:

153(10)=10011001(2)

Czy potrzebna jest nam zatem wiedza, jak dokonywać konwersji ręcznie? Wiedza ta może przydać się między innymi podczas programowania mikrokontrolerówmikrokontrolermikrokontrolerów, ale również posłuży nam jako podstawa do nauki bardziej skomplikowanych systemów liczbowych używanych w informatyce.

Konwersja

„Tłumaczenie” liczby dziesiętnej zaczynamy od poszukiwania największej potrzebnej wielokrotności podstawy systemu, czyli 2.

Wypiszmy kolejne potęgi liczby 2:

20=1
21=2
22=4
23=8
24=16
25=32
26=64
27=128
28=256
29=512
210=1024

Widzimy zatem, że nasza liczba 153Indeks dolny (10) znajduje się w następującym przedziale:

27153<28

To oznacza, że żeby zapisać liczbę 153Indeks dolny (10), będziemy potrzebować aż 8 cyfr w systemie dwójkowym.

Ciekawostka

Istnieje wzór matematyczny, dzięki któremu możemy policzyć, ile cyfr potrzebnych nam będzie do zapisania danej cyfry:

log2n

Gdzie n jest liczbą, którą próbujemy zapisać.

Zatem z tego wzoru możemy policzyć, że dla naszej liczby 153:

log21537,26

Ponieważ nie możemy wykorzystać tylko fragmentu cyfry, sięgamy do pierwszej liczby całkowitej, która zmieści w sobie ten wynik i otrzymamy odpowiedź – potrzebujemy 8 cyfr.

Analogiczne do systemu dziesiętnego musimy sprawdzić, jaka wielokrotność potęgi dwójki pojawi się na danej pozycji. W przypadku systemu dwójkowego zadanie jest ułatwione, ponieważ każda pozycja może przyjąć tylko dwie wartości: 0 i 1. Zaczynając od najwyżej wartości widzimy zatem, że:

127=128

Pierwszą cyfrą naszej liczby w systemie binarnym jest zatem 1. Odejmijmy tę wartość od początkowej liczby, żeby zobaczyć, jaka jest pozostała wartość, którą potrzebujemy przekonwertować.

153128=25

Ponieważ w wartości 25 nie jesteśmy w stanie „zmieścić” kolejnej potęgi o wartości 64, ta pozycja przyjmie wartość 0. Ta sama sytuacja powtórzy się w przypadku następnej pozycji o wartości 32, więc ta pozycja również przyjmie wartość 0.

026=0
025=0

Kolejna potęga, czyli 2Indeks górny 4 ma wartość 16, 25 jest większe od 16 więc:

124=16

Teraz odejmijmy tę wartość od 25 i otrzymamy:

2516=9

W następnym kroku stwierdzamy, że 9 jest większe od kolejnej potęgi, czyli 2Indeks górny 3, zatem wykonajmy znane nam już czynności:

123=8
98=1

Dokończmy obliczenia dla pozostałych cyfr:

022=0
021=0
120=1

Widzimy, że po zapisaniu cyfry na ostatniej pozycji pozostała wartość wyniosła zero. Oznacza to, że udało nam się poprawnie dokonać konwersji pomiędzy systemem dziesiętnym i dwójkowym. Wykonane operacje możemy zatem zapisać jako następującą sumę:

127+026+025+124+123+022+021+120=153
128+0+0+16+8+0+0+1=153
10011001(2)=153(10)

Optymalizacja

Skoro wykonywane obliczenia są powtarzalne, chcąc dokonać konwersji pisząc algorytm można wykorzystać pętlę. Możemy zauważyć, że wykonując obliczenia w przypadku liczby 153Indeks dolny (10) dzieliliśmy je poprzez kolejne potęgi liczby 2, aby sprawdzić, czy się w nich „zmieszczą”. Przyjrzyjmy się zatem, jak wyglądałby początek konwersji, jeśli użyjemy tej metody:

153:271,195
25:260,391
25:250,781

Liczba w części całkowitej prawidłowo wskazuje wartości kolejnych pozycji w systemie binarnym. Wciąż mamy jednak część dziesiętną, która przechowuje wartościowe informacje. Dlaczego? Spójrzmy na poniższe działania zapisane w postaci ułamków prostych:

153128=128128+25128
2564=064+2564
2532=032+2532

Możemy zauważyć, że część ułamkowa, będąca resztą z dzielenia, zawiera w sobie informację potrzebną nam w kolejnym kroku działania, a część dziesiętna zawiera kolejne cyfry rozwinięcia binarnego.

Do znajdowania kolejnych cyfr liczby w systemie dwójkowym możemy wykorzystać działanie modulo 2, czyli obliczanie reszty z dzielenia przez podstawę systemu liczbowego.

Nasz algorytm możemy zapisać przy pomocy następującego pseudokodu:

Linia 1. while n zamknij nawias ostrokątny 0 do. Linia 2. wynik znak równości n mod 2 plus wynik. Linia 3. n znak równości n prawy ukośnik 2.

Gdzie n jest konwertowaną liczbą dziesiętną, mod operacją wyznaczania reszty z dzielenia, a znak „/” oznacza dzielenie całkowite.

Słownik

podstawa systemu liczbowego
podstawa systemu liczbowego

nazywana też bazą systemu liczbowego. Podstawa określa ilość cyfr dostępnych do zapisywania liczb w danym systemie oraz służy do wyznaczania cyfr na poszczególnych pozycjach.

mikrokontroler
mikrokontroler

układ cyfrowy z mikroprocesorym zawarty w jednym układzie scalonym. Tego typu układy są powszechnie używane między innymi w sprzęcie RTV i AGD, urządzeniach podłączanych do komputerów (takich jak urządzenia peryferyjne czy karty rozszerzeń) i układach pomiarowych