JustPaste.it

Kod BCD

640689afe2853a49374b6fbf35c19b70.gif

 

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:

23034e537b9238a3d0bc537b148a9ea7.gif

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:

23034e537b9238a3d0bc537b148a9ea7.gif

 

 

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
1022
3
400
1022
2
200
1022
1
100
1022
0
80
1012
3
40
1012
2
20
1012
1
10
1012
0
8
1002
3
4
1002
2
2
1002
1
1
1002
0
 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] 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.

34194f1e506779608085127f8955846e.gif

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

5926dc1e1125c54c4b3be7ffde0850d3.gif    
   
    81a8cd1ccb8769b8cc2cf07e489179d2.gifZakres n-bitowych liczb w kodzie BCD wynosi

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

 
       

23034e537b9238a3d0bc537b148a9ea7.gif

 

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

dc1f6c918bcf40c8714add92f57bbc32.gif

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
5926dc1e1125c54c4b3be7ffde0850d3.gif    
   
   

81a8cd1ccb8769b8cc2cf07e489179d2.gif

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.

 

Źródło: mgr Jerzy Wałaszek