Strona główna » Algorytmy » Artykuły » Kod BCD
 

Kod BCD

Opis

Kod BCD przypisuje każdej cyfrze liczby dziesiętnej jej wartość zapisaną binarnie na czterech pozycjach. Kodując pojedynczą cyfrę można skorzystać z poniższej tabelki:

Cyfra0123456789
Kod BCD0000000100100011010001010110011110001001

W przypadku kodowania liczb złożonych z wielu cyfr każdą liczbę należy zamienić oddzielnie na kod BCD. Przykładowo 908 to 100100001000BCD. Chcąc przeliczyć zakodowaną liczbę z powrotem na dziesiętny system wystarczy pogrupować cyfry po cztery i przeliczyć kod binarny na dziesiętny. Przykładowo 00010011BCD = 13.

Spostrzeżenia

Jak nietrudno zauważyć bardzo łatwo można zakodować i rozkodować kod BCD. Warto jednak zauważyć, że tego typu kodowanie nie jest efektywne, ponieważ na czterech bitach można zapisać 16 różnych wartości, a wykorzystywanych jest zaledwie 10. Z tego powodu kodowanie to nie jest już praktycznie używane.

Implementacja

Kodowanie

Funkcja kodujBCD() zamienia liczbę dziesiętną w kod BCD. W wyniku otrzymywany jest tekst złożony z samych 0 i 1.

C++C#
Python
  1. def kodujBCD(a):
  2.   wynik = ""
  3.   while True:
  4.     cyfra = ""
  5.     c = a % 10
  6.     a //= 10
  7.     cyfra += chr(((c & 8) >> 3) + 48)
  8.     cyfra += chr(((c & 4) >> 2) + 48)
  9.     cyfra += chr(((c & 2) >> 1) + 48)
  10.     cyfra += chr(((c & 1) >> 0) + 48)
  11.     wynik = cyfra + wynik
  12.     if a == 0:
  13.       break
  14.   return wynik

W trakcie zamiany należy pamiętać, że kolejne cyfry liczby są wybierane z jej końca, a więc należy pamiętać, aby je dołączać na początku wyniku, a nie na końcu. W celu przeliczania z liczb na tekst wykonywane są operacje binarne, aby otrzymać odpowiedni bit, a następnie jest on zamieniany na cyfrę.

Dekodowanie

W celu zamiany kodu BCD na dziesiętny należy skorzystać z dekodujBCD(). Jako argument przyjmuje ona kod BCD zapisany jako tekst, a w wyniku otrzymuje się liczbę dziesiętną.

C++C#
Python
  1. def dekodujBCD(bcd):
  2.   a = 0
  3.   for i in range(0, len(bcd), 4):
  4.     c = 0
  5.     c += (ord(bcd[i]) - 48) * 8
  6.     c += (ord(bcd[i + 1]) - 48) * 4
  7.     c += (ord(bcd[i + 2]) - 48) * 2
  8.     c += (ord(bcd[i + 3]) - 48) * 1
  9.     a = a * 10 + c
  10.   return a

Podczas dekodowania należy odczytywać po 4 kolejne znaki i przyjąć, że każdy z nich ma kolejno wagę 8, 4, 2, 1. Po zsumowaniu wszystkich wag pozycji z wartościami 1 otrzymujemy zakodowaną cyfrę, którą należy dołączyć z lewej strony kodu.

Testowanie funkcji

Do przetestowania kodu można skorzystać z poniższego fragmentu kodu, która wczytuje od użytkownika liczbę do zamiany na kod BCD, a następnie dekoduje i wyświetla obydwie obliczone wartości.

C++C#
Python
  1. a = int(input("Podaj liczbę do konwersji:\n a = "))
  2. bcd = kodujBCD(a)
  3. print("BCD:", bcd)
  4. print("DEC:", dekodujBCD(bcd))

Zadania

Upakowane BCD

Najmniejszym typem danych jest bajt składający się z 8 bitów. Oznacza to, że w każdym bajcie można zmieścić dwie cyfry. W przypadku, gdy bardziej znaczącej części bajtu nie odpowiada żadna wartość to jest ona ustawiona np. na 1111. Jeśli kod BCD został zapisany jako tablica bajtów i każda cyfra używa tylko pół bajtu to nazywany taki kod upakowanym. Później przed dekodowaniem należy go rozpakować.

Zadanie 1

Napisz program, który pozwoli na upakowanie liczby ośmiocyfrowej w zmiennej całkowitoliczbowej czyli np. int o rozmiarze 4 bajtów czyli zdolnej pomieścić 8 cyfr zakodowanych poprzez kod BCD. Dopisz również funkcję do rozpakowania takiej wartości i zamiany jej na liczbę dziesiętną.

Przykładowo liczbie 1234 zakodowanej jako BCD odpowiada 0001001000110100(, ale kod zapisany w zmiennej całkowitoliczbowej będzie miał wartość 4660).