Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Kod BCD

SPIS TREŚCI
Podrozdziały

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.


Na początek:  podrozdziału   strony 

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

Zapameię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

Na początek:  podrozdziału   strony 

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

Na początek:  podrozdziału   strony 

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.


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.