2. Konwersja kodu - różne systemy
System liczbowy to zbiór reguł służących do zapisywania, odczytywania i nazywania liczb.
W artykule tym przedstawię, najprościej jak się da, nie pomijając kluczowych teorii matematycznych sposoby zamiany liczb dziesiętnych na binarne, ósemkowe, szesnastkowe i BCD.
System dwójkowy nazywany także binarnym
Dwójkowy system liczbowy to system pozycyjny o podstawie "2". Zapis liczb odbywa się przy użyciu cyfr "0" i "1".
Np. zapis (1001)2= 1*23+ 0*22+ 0*21+ 1*20=(9)10
Wyobraźmy sobie, że chcemy zapisać liczbę dziesiętną "sześć" (6)10 w kodzie binarnym. Aby to zrobić można podzielić tę liczbę przez 2 aż wynik osiągnie zero. Czyli:
6 |2 to 3 reszty 0 bo (3*2)= 6
3 |2 to 1 reszty 1 bo (1*2)+ 1(reszty)=3
1 |2 to 0 reszty 1 MSB bo (0*2)+ 1=1
Naszym wynikiem jest wynik reszty. Zapis kodu dwójkowego rozpoczynamy od MSB czyli po kolei wypisując resztę "od dołu do góry" wyjdzie nam 110.
(6)10=(110)2
Przedstawię to bardziej wizualnie.
Pamiętaj:
- reszta w systemie binarnym może przyjmować tylko wartości 0 lub 1
- dzielisz tak długo aż wynik z dzielenia będzie równy "0"
- najważniejszy jest zapis wyniku.
System ósemkowy (oktalny)
Oktalny system ma podstawę równą "8". Zapis liczb odbywa się przy użyciu cyfr: 0,1,2,3,4,5,6,7
Np. zapis (30)8= 3*81+ 0*80 = (24)10
Zamianę liczb dziesiętnych na oktalne wykonujemy takim samym sposobem jak w kodzie binarnym. Dzielimy liczbę dziesiętną przez "8" aż wynik z dzielenia będzie równy "0", pamiętając, że reszta może tym razem przybierać wartości od "0" do "7" włącznie.
Zapis szesnastkowy (heksadecymalny)
Ten system ma podstawę "16". Zapis liczb odbywa się przy użyciu następujących cyfr i znaków: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
gdzie:
A- oznacza "10"
B- 11
C- 12
D- 13
E- 14
F- 15
Co to znaczy? Otóż to, że np. liczba (13)10 = (D)16
W takim razie np (1A)16 = (26)10
Dzielimy podobnie jak w poprzednich systemach pamiętając o wartościach jakie przybiera reszta i pamiętając o tym by 10, 11, itd. zapisywać jako A, B itd...
System BCD-zapis dwójkowo dziesiętny
BCD: Binary Coded Decimal czyli liczby dziesiętne zakodowane binarnie.
Są różne kody BCD które różnią się formą zapisu dlatego już na wstępie uświadamiam, że piszę tu o kodzie BCD 8421 inaczej nazywanym też NBCD a potocznie po prostu BCD.
W kodzie BCD każdą cyfrę liczby dziesiętnej zapisujemy za pomocą kodu binarnego w reprezentacji 4 bitowej czyli:
1- 0001
2- 0010
3- 0011
4- 0100
5- 0101
6- 0110
7- 0111
8- 1000
9- 1001
W takim razie liczbę (123)10 zapiszemy (0001 0010 0011)BCD
Normalnie nie oddziela się grup 4-bitowych spacjami ale dla ułatwienia odczytu i zaprezentowania idei tak zrobiłem.
(543)10 zapiszemy (010101000011)BCD
(1)10 zapiszemy (0001)BCD
Dodawanie liczb binarnych
W dodawaniu liczb binarnych należy pamiętać o takich zasadach, że:
0+0=0
0+1=1
1+0=1
1+1=0 i "1" zapisujemy w pamięci lub pisząc inaczej "przenosimy o jedną pozycję dalej"
(5)10+(6)10=(11)10 To nie podlega wątpliwości:):)
(5)10=(101)2
(6)10=(110)2
Jak widać otrzymaliśmy bardzo dobry wynik czyli (11)10=(1011)2
W ten sposób zawsze można sprawdzić czy dobrze policzyliśmy - zamieniając liczby dwójkowe na dziesiętne.
Kolejny przykład
(59)10=(0111011)2
(72)10=(1001000)2
(59)10+(72)10=(131)10
Obliczenia się zgadzają ponieważ:
(131)10=(10000011)2
Odejmowanie liczb binarnych
Odejmowanie liczb binarnych wykonuje się poprzez zamianę jednej z liczb na ujemną. A zatem odejmowanie jest niczym innym jak dodawaniem ujemnych liczb binarnych. Skoro tak to trzeba wiedzieć jak zapisywać liczby binarne dodatnie w postaci ujemnej.
Gdy chcemy zapisać liczbę o podst. dziesiętnej jako ujemną to po prostu dajemy minus "-", np. (-10)10
Liczby binarną można zapisać w postaci ujemnej na dwa sposoby:
1. Zapis Uzupełnienie do 2 - U2, czyli (10110100)2=(01001100)U2
Przepisujemy bity od prawej strony do pierwszej jedynki (włącznie)a kolejne bity przepisujemy na odwrót (z zaprzeczeniem)
2. Zapis Uzupełnienie do 1 - U1, czyli (10110100)2=(01001011)U1
Wszystkie bity przepisujemy z zaprzeczeniem. Uzupełnienie do 1 liczby binarnej jest zawsze negacją bitów tej liczby.
Czy liczby ujemne będą zapisane na U1 czy na U2 to stanowi kwestią umowną. Należy z góry zdefiniować jaki jest stosowany zapis dla ujemnych.
w przypadku działań na liczbach ujemnych ostatni bit, czyli bit znajdujący się po lewej stronie, bit znaku informuje nas czy liczba jest w ogóle ujemna czy nie. Jeżeli jest zero, np 01111 to znaczy że liczba jest dodatnia ale jeżeli jest "jedynka", np. 10011 to znaczy ze mamy do czynienia z liczbą ujemną w zapisie takim jaki został wyznaczony.
Schemat dodawania w wypadku zapisu U1
Dodawanie dwóch liczb binarnych w przypadku, gdy liczby ujemne są reprezentowane w zapisie U1, wykonywane jest przez dodanie tych liczb wraz z bitami znaku.
Gdy istnieje przeniesienie z najbardziej znaczącej pozycji (MSB - w razie pytań patrz - poprzedni artykuł!), to wynik zostaje zwiększony o jeden, czyli przeniesienie dodajemy do najmniej znaczącej pozycji.
Jeżeli wynik dodawania jest dodatni to otrzymana liczba jest liczbą binarną.
Jeżeli wynik jest ujemny to należy wykonać na nim jeszcze raz zapis U1,pozostawiając bit znaku bez zmian, i wtedy wynik przyjmie postać binarną.
Przykład:
Schemat dodawania w wypadku zapisu U2
Dodawanie dwóch liczb binarnych ze znakiem w przypadku, gdy liczba ujemna zapisana jest jako U2, wykonywane jest przez dodanie tych liczb łącznie z bitem znaku.
Przeniesienie na najbardziej znaczącej pozycji zostaje odrzucone.
Jeżeli wynik dodawania jest dodatni to otrzymana liczba jest liczbą binarną.
Jeżeli wynik dodawania jest ujemny to na otrzymanej liczbie należy wykonać jeszcze raz zapis U2 pozostawiając oczywiście bit znaku bez zmian.
Przykład:
W wypadku innych systemów liczbowych (ósemkowy, szesnastkowy itp...) schemat postępowania przedstawia się podobnie. Również należy uzyskać zapis U1 lub U2 a później rozpocząć odejmowanie.