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
Artykuł pobrano ze strony
eioba.pl
Kod BCD
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).
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 (2
8
) 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
d
2
d
1
d
0
Waga pozycji
800
10
2
2
3
400
10
2
2
2
200
10
2
2
1
100
10
2
2
0
80
10
1
2
3
40
10
1
2
2
20
10
1
2
1
10
10
1
2
0
8
10
0
2
3
4
10
0
2
2
2
10
0
2
1
1
10
0
2
0
Cyfra dwójkowa b
11
b
10
b
9
b
8
b
7
b
6
b
5
b
4
b
3
b
2
b
1
b
0
Waga i-tej pozycji w kodzie BCD ma wartość 10
[i/4]
x2
i mod4
. Wobec tego wzór na
wartość n-bitowej liczby BCD jest następujący:
b
n-1
...b
1
b
0
= b
n-1
x10
[(n-1)/4]
x2
(n-1)mod4
+ ... + b
1
x10
0
x2
1
+ b
0
x10
0
x2
0
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 = 10
1
- 1
dla d = 2 max
(BCD)
= 99 = 10
2
- 1
dla d = 3 max
(BCD)
= 999 = 10
3
- 1
...
Widzimy, że górny kres jest równy:
max
(BCD)
=10
d
- 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
= (2
n mod4
- 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 + (2
n mod 4
- 1) x 10
[n : 4]
max
(BCD) Całość
= 10
[n : 4]
+ (2
n mod 4
- 1) x 10
[n : 4]
- 1
max
(BCD) Całość
= 10
[n : 4]
x (1 + 2
n mod 4
- 1) - 1
max
(BCD) Całość
= 10
[n : 4]
x 2
n mod 4
- 1
Zakres n-bitowych liczb w kodzie BCD wynosi
Z
(BCD)
= 0 ... 10
[n : 4]
x 2
n mod 4
- 1
Obliczyć zakres 10-bitowych liczb zapisanych w kodzie BCD.
Z
(BCD)
= 10
[10 : 4]
x2
10 mod 4
- 1
Z
(BCD)
= 10
[2,5]
x2
2
- 1
Z
(BCD)
= 10
2
x2
2
-
Z
(BCD)
= 100 x4 - 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 0101
24 -15
0010 0100
- 0001 0101
0100 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 0101
24 -15
0010 0100
- 0001 0101
0100
1010
+ 0000
0110
0000
1111
- 0000
0110
0101 0000
Wynik = 50
0000 1001
Wynik = 9
Korekcja 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 1001
31 -18
0011 0001
- 0001 1000
010
00010
+ 0000
0110
000
11001
- 0000
0110
0100 1000
Wynik = 48
0001 0011
Wynik = 13
W systemie BCD korekcja przy dodawaniu polega na dodaniu (lub odjęciu przy
odejmowaniu) do grupy bitów reprezentujących cyfrę dziesiętną liczby 0110 (6).
Korekcję wykonujemy, gdy po operacji arytmetycznej:
grupa bitów nie przedstawia cyfry dziesiętnej
nastąpiło przeniesienie (pożyczka) do następnej grupy bitów
Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.
Autor: mgr Jerzy Wałaszek
Przedruk ze strony:
http://www.i-lo.tarnow.pl/edu/inf/alg/num/index.html
Artykuł pobrano ze strony
eioba.pl