Arytmetyka kodów | 24.10.2009. autor : typ |
Arytmetyka kodów
Często nie zdajemy sobie sprawy, że procesor w naszym komputerze sterowany jest za pomocą prostych sygnałów, a mianowicie kodu dwójkowego, czyli binarnego – ciągu zer i jedynek. Dla większości już samo zrozumienie tego jest „czarną magią”, a tu nasza maszynka porozumiewa się także i drugim językiem, kodem szesnastkowym znanym jako Heksadecymalny (Hex). Chciałbym więc przybliżyć wszystkim zainteresowanym obydwa rodzaje kodów, i pokazać że tak naprawdę nie ma w tym nic trudnego! Jednak praktycznie zawsze operuje się tu dużymi liczbami, więc bardzo pożądany jest kalkulator z dużą ilością cyfr na wyświetlaczu. Przy przerabianiu tych tematów w szkołach przeważnie wymagane jest aby każdy uczeń miał ze sobą kalkulator.
Przeliczanie z systemu dziesiętnego na binarnyMądre podręczniki podają równie mądre i bardzo długie wzory przeliczeń. Jednak jest o wiele prostszy sposób. Kod binarny z systemu dziesiętnego uzyskamy dzieląc wybraną liczbę na 2. Zaprezentuję to na prostym przykładzie. Warto wziąć kalkulator i kartkę do ręki żeby śledzić i sprawdzać przebieg – pomaga to zrozumieć. A więc dla przykładu weźmy jakąś datę, np. datę przystąpienia do prac nad MH:
10.03.2006rZapisujemy ją bez kropek:
10032006Teraz dzielimy ją na 2:
10032006 : 2 = 5016003W tym dzieleniu nie uzyskaliśmy reszty, czyli spisujemy 0. Teraz podzielmy wynik poprzedniego działania:
5016003 : 2 = 2508001.5Tutaj uzyskaliśmy już resztę. W takim razie zapisujemy pod poprzednim zerem jedynkę. Teraz ponownie dzielimy wynik, „ucinamy” jednak resztę, czyli dzielimy 2508001 na 2
2508001 : 2 = 1254000.5Ponownie uzyskaliśmy resztę, więc spisujemy 1. Kontynuujmy:
1254000 : 2 = 627000 reszta: 0
627000 : 2 = 313500 reszta: 0
313500 : 2 = 156750 reszta: 0
156750 : 2 = 78375 reszta: 0
78375 : 2 = 39187 reszta: 1
39187 : 2 = 19593 reszta: 1
19593 : 2 = 9796 reszta: 1
9796 : 2 = 4898 reszta: 0
4898 : 2 = 2449 reszta: 0
2449 : 2 = 1224 reszta: 1
1224 : 2 = 612 Rest: 0
612 : 2 = 306 reszta: 0
306 : 2 = 153 reszta: 0
153 : 2 = 76 reszta: 1
76 : 2 = 38 reszta: 0
38 : 2 = 19 reszta: 0
19 : 2 = 9 reszta: 1
9 : 2 = 4 reszta: 1
4 : 2 = 2 reszta: 0
2 : 2 = 1 reszta: 0
1 : 2 = 0 reszta: 1
Teraz spiszmy wszystkie te zera i jedynki. Uwaga! Spisujemy „od tyłu”. Otrzymany kod:
100110010001001110000110Teraz wypadało by go podzielić na coś łatwiejszego do dalszych przekształceń. Grupujemy więc cyfry po cztery. Uwaga! Zaczynamy od prawej strony! Teraz otrzymaliśmy:
1001 1001 0001 0011 1000 0110Przekształcenie z kodu dwójkowego na szesnastkowy
Teraz ponownie uprościmy kod. Mianowicie zmienimy go z binarnego na szesnastkowy. Jest to bardo proste. Wcześniej podzieliliśmy ciąg zer i jedynek na grupy po cztery znaki.
Tak więc: 0001 oznacza 1, 0010 oznacza 2, 0011 oznacza 3… Czy musimy to znać na pamięć? Nie! Jako że kod dwójkowy oparty jest na wielokrotnościach cyfry 2 „rozkodowanie” wygląda w następujący sposób: pierwsze cyfra od prawej oznacza 2 do potęgi 0 czyli 1. Jeśli w tym miejscu mamy wpisane 1, liczymy jedynkę – jeśli zero nie liczymy jej. Druga cyfra oznacza 2 do potęgi 1, czyli 2 – i analogicznie – jeśli jest tu 1, liczymy dwójkę, a jeśli nie – nie liczymy. Następnie jest 2 do potęgi 2 (czyli 4), oraz 2 do potęgi 3 czyli 8. Jeszcze prościej:
1001=
1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 1*8 + 0*4 + 0*2 + 1*1= 8 + 1 = 9
Takim oto sposobem uzyskaliśmy z 1001B (Binarnej) 9Hex (Heksadecymalnej). Z tych czterech cyfr możemy uzyskać maksymalnie liczbę 15 (1111 = 8 + 4 + 2 + 1 = 15). Z tym, że od 10 do 15 nie zapisujemy już liczbami a za pomocą wielkich liter od A do F (ABCDEF). Dokładnie rozpisane jest to w tabelce na końcu artykułu.
Tak więc przeliczmy teraz nasz kod binarny na szesnastkowy:
1001 = 9
1001 = 9
0001 = 1
0011 = 3
1000 = 8
0110 = 6
Czyli 100110010001001110000110B = 991386Hex (zawsze na końcu dopisujmy z jakiego kodu jest to liczba! D – dziesiętny, B – Binarny, Hex – Heksadecymalny). Zamiana w drugą stronę jest analogiczna – po prostu zapisujemy cyfrę (np. 9) w postaci binarnej (dla 9 jest to 1001)
Przeliczanie z kodu szesnastkowego na dziesiętnyTutaj łatwo wpaść w panikę – jak z jakiejś mieszanki liter i cyfr uzyskać liczbę dziesiętną?! Na szczęście i to nie jest takie skomplikowane jak się wydaje za pierwszym, a czasem i za drugim rzutem oka :) Należy przede wszystkim pamiętać o dwóch rzeczach. Po pierwsze – jaka cyfra odpowiada jakiej literze (czyli 10 to jest A, 11 to jest B itd.), oraz że w systemach komputerowych potęgowanie zaczynamy od 0.
A więc weźmy naszą zakodowaną datę: 991386Hex
Obliczamy to w następujący sposób:
9*16^5 + 9*16^4 + 1*16^3 + 3*16^2 + 8*16^1 + 6*16^0 =
9*1048576 + 9*65536 + 1*4096 + 3*256 + 8*16 + 6*1 =
9437184 + 589824 + 4096 + 768 + 128 + 6 =
10032006
Czyli z powrotem uzyskaliśmy datę 10.03.2006r czyli dzień rozpoczęcia prac nad MH. Widać tutaj ogromne podobieństwo pomiędzy przeliczaniem z binarnego na dziesiętny a przeliczaniem z szesnastkowego na dziesiętny. Zasada jest dokładnie ta sama z tą różnicą że zamiast wielokrotności dwójki mamy wielokrotności szesnastki.
Przeliczanie z dziesiętnego na szesnastkowyTu trzeba włożyć trochę więcej wysiłku niż w przeliczaniu z dziesiętnego na binarne. Choć wygląda to podobnie, to jest to trochę trudniejsze.
Tak więc przejdźmy od razu do obliczeń. Ponownie użyjemy tej samej daty co poprzednio.
10032006Dzielimy to na 16. Otrzymujemy 627000.375. Przepisujemy wynik bez reszty pod poprzedni. Teraz mnożymy go razy 16. Otrzymamy 10032000 – różnicę 10032006 i 10032000 (czyli 6) zapisujemy. Teraz dzielimy 627000 przez 16. Otrzymujemy 39187.5, zapisujemy bez reszty i mnożymy razy 16, otrzymujemy 626992. Różnica wynosi tym razem 8 (627000 – 626992 = 8). Zapisujemy 8 jako wynik i liczymy dalej. Poniżej podam same wyniki:
39187 (3)2449 (1)
153 (9)
9 (9) (9 dzielone na 16 daje 0 z resztą. Zero razy 16 jest równe 0. A różnica pomiędzy 9 i 0 wynosi 9. Dalej nie dzielimy, ponieważ wyniki są już „po przecinku”).
A więc otrzymaliśmy znowu 991386Hex.
Kod BCDKod binarny który poznaliśmy na początku jest kodem NKB, czyli jest to Naturalny Kod Binarny. Istnieje także drugi kod, znacznie prostszy – BCD, z którego korzystają niektóre maszyny. Nie przeliczamy w nim całych liczb (np. 123D = 1111011), ale każdą liczbę osobno (1 = 0001; 2 = 0010; 3 = 0011).
Tabela kodówOto tabelka, która pokazuje jaka cyfra systemu dziesiętnego odpowiada jakiej cyfrze systemu szesnastkowego oraz jakiej kombinacji systemu binarnego.
System dziesiętny | System binarny | System szesnastkowy |
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Nietrudno zauważyć tu pewną prawidłowość w przypadku systemu binarnego:
W ten sposób łatwo jest zapamiętać sobie tą tabelkę.
- Ostatnia kolumna to zawsze powtarzające się 01;
- Przedostatnia kolumna to powtarzająca się kombinacja 0011;
- Trzecia kolumna od końca to kolejna kombinacja: 4 zera, 4 jedynki, 4 zera, 4 jedynki;
- Czwarta kolumna od końca to osiem zer a po nich osiem jedynek;
[Podziękowania dla harhar’a za pomoc przy znalezieniu błędu w obliczeniach :) ]