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.

  1. static string kodujBCD(int a) {
  2.   string wynik = "";
  3.   do {
  4.     string cyfra = "";
  5.     int c = a % 10;
  6.     a /= 10;
  7.     cyfra += (char)(((c & 8) >> 3) + '0');
  8.     cyfra += (char)(((c & 4) >> 2) + '0');
  9.     cyfra += (char)(((c & 2) >> 1) + '0');
  10.     cyfra += (char)(((c & 1) >> 0) + '0');
  11.     wynik = cyfra + wynik;
  12.   } while (a > 0);
  13.   return wynik;
  14. }

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ą.

  1. static int dekodujBCD(string bcd) {
  2.   int a = 0;
  3.   for (int i = 0; i < bcd.Length; i += 4) {
  4.     int c = 0;
  5.     c += (bcd[i] - '0') * 8;
  6.     c += (bcd[i + 1] - '0') * 4;
  7.     c += (bcd[i + 2] - '0') * 2;
  8.     c += (bcd[i + 3] - '0') * 1;
  9.     a = a * 10 + c;
  10.   }
  11.   return a;
  12. }

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.

  1. static void Main(string[] args) {
  2.   Console.Write("Podaj liczbę do konwersji:\n a = ");
  3.   int a = Convert.ToInt32(Console.ReadLine());
  4.   string bcd = kodujBCD(a);
  5.   Console.WriteLine("BCD: {0}", bcd);
  6.   int b = dekodujBCD(bcd);
  7.   Console.WriteLine("DEC: {0}", b);
  8.   Console.ReadLine();
  9. }

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).