Istnieje wiele przykładów urządzeń, w których zastosowanie czystego kodu dwójkowego jest nieekonomiczne z uwagi na ciągłą konieczność przeliczania liczb pomiędzy systemami dziesiętnym i dwójkowym. Są to różnego rodzaju liczniki, kasy sklepowe, kalkulatory, wagi itp. Dla nich opracowano specjalny kod zwany systemem dziesiętnym kodowanym dwójkowo - BCD (ang. Binary Coded Decimal).
Kody cyfr dziesiętnych w systemie BCD | |
---|---|
cyfra | kod BCD |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
Idea kodu jest bardzo prosta - dwójkowo zapisujemy nie wartość liczby lecz jej cyfry dziesiętne. Każda cyfra dziesiętna może być przedstawiona w postaci wartości w naturalnym kodzie binarnym. Do tego celu potrzebne są 4 bity. Kody poszczególnych cyfr przedstawiliśmy w tabelce obok.
Aby odczytać wartość liczby BCD wystarczy podzielić jej kod na grupy 4 bitowe. Każdą grupę zamieniamy zgodnie z tabelką na cyfrę dziesiętną i otrzymujemy zapis liczby w systemie dziesiętnym:
10000100(BCD) = 1000 0100 = 84(10)
010101110010(BCD) = 0101 0111 0010 = 572(10)
0011011110001001(BCD) = 0011 0111 1000 1001 = 3789(10)
W odwrotną stronę jest również prosto - każdą cyfrę dziesiętną zastępujemy 4 bitami z tabelki i otrzymujemy kod BCD:
72398015(10) = 0111 0010 0011 1001 1000 0000 0001 0101(BCD)
Jeśli bity liczby BCD zostaną przekonwertowane na system szesnastkowy, to otrzymane cyfry szesnastkowe odpowiadają dokładnie cyfrom dziesiętnym wartości liczby BCD. Z tej własności często korzystają programiści zapisując kod BCD właśnie w systemie szesnastkowym.
Kod BCD nie jest kodem efektywnym, ponieważ nie wykorzystuje wszystkich możliwych kombinacji bitów w słówkach kodowych - sprawdź to w tabelce. Wynika z tego oczywisty wniosek, iż niektóre słowa kodowe nie są dozwolone, gdyż nie reprezentują cyfr dziesiętnych:
110111111010(BCD) = 1101 1111 1010 = ???(10)
8 bitowa liczba BCD zawiera dwie cyfry dziesiętne, zatem może przyjąć wartości z zakresu od 00 do 99, co daje 100 słów kodowych. Tymczasem 8 bitów można ze sobą połączyć na 256 (28) sposobów. Zatem 156 słów kodowych nie będzie wykorzystanych przez kod BCD - to więcej niż połowa? A jak sprawa ta przedstawia się dla 16 bitów, 24 bitów i 32 bitów?
Cóż, czasami za wygodę w jednej dziedzinie, musimy coś poświęcić w innej dziedzinie. Ostatecznie nadmiarowe słówka kodowe można wykorzystać do kontroli poprawności kodu BCD - jeśli otrzymamy zabronioną kombinację bitów, to od razu wiemy, że coś poszło źle.
Podchodząc do zagadnienia w sposób formalny, możemy wyprowadzić wzór, który na podstawie stanu bitów liczby BCD pozwoli nam obliczyć jej wartość dziesiętną. W tym celu rozważmy wagi pozycji 12-bitowej liczby BCD:
Cyfra dziesiętna d2 d1 d0 Waga pozycji 800
10223400
10222200
10221100
1022080
1012340
1012220
1012110
101208
100234
100222
100211
10020Cyfra dwójkowa b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 Waga i-tej pozycji w kodzie BCD ma wartość 10[i/4] x 2i mod 4. Wobec tego wzór na wartość n-bitowej liczby BCD jest następujący:
bn-1...b1b0 = bn-1 x 10[(n-1)/4] x 2(n-1) mod 4 + ... + b1 x 100 x 21 + b0 x 100 x 20
Wzór do najprostszych nie należy i osobiście wątpię, czy ktokolwiek chciałby go używać. Szybciej znajdziemy wartość liczby grupując bity i zamieniając je na cyfry dziesiętne.
Najmniejszą wartość liczba BCD osiągnie dla wszystkich bitów równych 0. Czyli:
min(BCD) = 0
W celu wyznaczenia górnej granicy obliczamy liczbę d pełnych cyfr dziesiętnych zakodowanych w czwórkach bitów liczby BCD. Liczbę tę znajdziemy jako część całkowitą z dzielenia n przez 4:
d = [n : 4]
Każda pozycja dziesiętna może przyjąć maksymalnie wartość 9. I tak:
dla d = 1 max(BCD) = 9 = 101 - 1
dla d = 2 max(BCD) = 99 = 102 - 1
dla d = 3 max(BCD) = 999 = 103 - 1
...Widzimy, że górny kres jest równy:
max(BCD) = 10d - 1 = 10[n : 4] - 1
Może się okazać, iż liczba BCD zawiera więcej bitów niż wielokrotność 4. W takim przypadku najstarsze bity (których może być 0,1,2 lub 3) tworzą maksymalnie cyfrę o wartości:
max(BCD) Reszta = (2n mod 4 - 1) x 10[n : 4]
Po zsumowaniu otrzymujemy ostatecznie:
max(BCD) Całość = max(BCD) + max(BCD) Reszta
max(BCD) Całość = 10[n : 4] - 1 + (2n mod 4 - 1) x 10[n : 4]
max(BCD) Całość = 10[n : 4] + (2n mod 4 - 1) x 10[n : 4] - 1
max(BCD) Całość = 10[n : 4] x (1 + 2n mod 4 - 1) - 1
max(BCD) Całość = 10[n : 4] x 2n mod 4 - 1
Zakres n-bitowych liczb w kodzie BCD wynosi
| |||
Obliczyć zakres 10-bitowych liczb zapisanych w kodzie BCD.
Z(BCD) = 10[10 : 4] x 210 mod 4 - 1
Z(BCD) = 10[2,5] x 22 - 1
Z(BCD) = 102 x 22 -
Z(BCD) = 100 x 4 - 1
Z(BCD) = 400 - 1
Z(BCD) = 399
Ponieważ liczby w kodzie BCD nie są naturalnymi liczbami dwójkowymi, zatem nie można nad nimi wykonywać normalnych działań arytmetycznych. Sprawdźmy:
15 + 35
0001 0101
+ 0011 010124 -15
0010 0100
- 0001 01010100 1010
Wynik zły!0000 1111
Wynik zły!Po wykonaniu standardowej operacji nad liczbami w kodzie BCD należy sprawdzić i w razie potrzeby skorygować wynik. Dla dodawania i odejmowania korekcja będzie potrzebna wtedy, gdy dana grupa bitów reprezentujących cyfrę dziesiętną ma wartość większą od 9 (binarnie 1001). W takiej sytuacji do grupy tej należy dodać (dla odejmowania odjąć) wartość binarną 0110 (dziesiętnie 6). Sprawdźmy ponownie (kolorem czerwonym zaznaczyliśmy korekcję wyniku):
15 + 35
0001 0101
+ 0011 010124 -15
0010 0100
- 0001 01010100 1010
+ 0000 01100000 1111
- 0000 01100101 0000
Wynik = 500000 1001
Wynik = 9Korekcja musi również wystąpić, gdy w trakcie dodawania wystąpiło przeniesienie (przy odejmowaniu pożyczka) do sąsiedniej grupy bitów. Np:
29 + 19
0010 1001
+ 0001 100131 -18
0011 0001
- 0001 10000100 0010
+ 0000 01100001 1001
- 0000 01100100 1000
Wynik = 480001 0011
Wynik = 13
| |||
Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.
Źródło: mgr Jerzy Wałaszek