Serwis Edukacyjny w I-LO w Tarnowie 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
|
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.
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 |
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:
|
Zaproponuj system zapisu liczb BCD ze znakiem. Określ reguły arytmetyki takich liczb.
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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.