Kod BCD


Podrozdziały Tematy pokrewne

 

Wartość liczby 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).

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:

 

Przykład:

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:

 

Przykład:

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
10223
400
10222
200
10221
100
10220
80
10123
40
10122
20
10121
10
10120
8
10023
4
10022
2
10021
1
10020
 Cyfra 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] × 2i mod 4. Wobec tego wzór na wartość n-bitowej liczby BCD jest następujący:

 

bn-1...b1b0 = bn-1 × 10[(n-1)/4] × 2(n-1) mod 4 + ... + b1 × 100 × 21 + b0 × 100 × 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.

 

Zakres liczb BCD

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) × 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) × 10[n : 4]
max(BCD) Całość = 10[n : 4] + (2n mod 4 - 1) × 10[n : 4] - 1
max(BCD) Całość = 10[n : 4] × (1 + 2n mod 4 - 1) - 1
max(BCD) Całość = 10[n : 4] × 2n mod 4 - 1

 

Zapamiętaj:

Zakres n-bitowych liczb w kodzie BCD wynosi

 

Z(BCD) = 0 ... 10[n : 4] × 2n mod 4 - 1

 

Przykład:

Obliczyć zakres 10-bitowych liczb zapisanych w kodzie BCD.

 

Z(BCD) = 10[10 : 4] × 210 mod 4 - 1
Z(BCD) = 10[2,5] × 22 - 1
Z(BCD) = 102 × 22 - 1
Z(BCD) = 100 × 4 - 1
Z(BCD) = 400 - 1
Z(BCD) = 399

 

Arytmetyka liczb BCD

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
0100 0010
+ 0000 0110
  0001 1001
- 0000 0110
0100 1000
Wynik = 48
  0001 0011
Wynik = 13

 

Zapamiętaj:

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

 

Zadania

Zadanie 1 (łatwe)

Oblicz wartość dziesiętną liczb zapisanych w kodzie BCD
100000000001(BCD) =  (10)  

.

011100110101(BCD) =  (10)  

.

01100100100100100011(BCD) =  (10)  

.

011001010100001100100001(BCD) =  (10)  

.

000110011001(BCD) =  (10)  

.

 

Zadanie 2 (łatwe)

Przelicz podane liczby dziesiętne na ich zapis w kodzie BCD o odpowiedniej długości
5012(10) =  (BCD)  

.

386(10) =  (BCD)  

.

2768133(10) =  (BCD)  

.

92701(10) =  (BCD)  

.

44872(10) =  (BCD)  

.

 

Zadanie 3 (trudne)

Zaproponuj system zapisu liczb BCD ze znakiem. Określ reguły arytmetyki takich liczb.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.