BCD è l'acronimo di Binary Coded Decimal, tradotto: Codice Binario-Decimale. Sostanzialmente ciò che si fà e codificare le dieci cifre del sistema decimale a base 10, da qui il nome BCD.

Per codificare le 10 cifre del sistema decimale il numero minimo essenziale di bit per la lunghezza delle parole della nostra codifica è 4, infatti \(10 \leq 16 \leq 2^4 \). Con 3 soli bit posso rappresentare al massimo 8 parole differenti, e non possiamo usare 3 bit altrimenti non ci sarebbero configurazioni sufficienti per rappresentare tutte le cifre (2 rimarrebbero escluse).

DEC BCD
\( 0 \)\( 0000 \)
\( 1 \)\( 0001 \)
\( 2 \)\( 0010 \)
\( 3 \)\( 0011 \)
\( 4 \)\( 0100 \)
\( 5 \)\( 0101 \)
\( 6 \)\( 0110 \)
\( 7 \)\( 0111 \)
\( 8 \)\( 1000\)
\( 9 \)\( 1001 \)
$$ \sum_{i=0}^3 c_i\cdot 2^i $$

Proprietà del codice BCD
Il codice BCD è un codice ponderato o pesato: La codifica si ottiene sommando i pesi relativi alle posizioni occupate dalle cifre un una parola di codice o letterale. I pesi del codice sono analoghi a quelli tradizionali della notazione binaria naturale, in particolare essi sono: \( 8-4-2-1 \) . Tutte le parole BCD sono a 4 bit, di conseguenza i pesi sono 4 e la codifica viene spesso chiamata BCD8421 $$ \diamond\diamond\diamond $$ Se vogliamo codificare un numero decimale ad esempio il numero \( 453 \) il procedimento è meccanico. Bisogna tradurre ogni singola cifra e sostituire ad essa la sua codifica riportata nella tavola: $$ {\large 453_{10} \rightarrow \underbrace{0100}_4 | \underbrace{0101}_5 | \underbrace{0011}_3 } $$

Somma BCD

E' possibile operare le somme e le altre operazioni elementari nella codifica BCD prestando però attenzione ad alcune problematiche dovute alla "pseudo-ridondanza" della tavola di codifica. Per pseudo-ridondanza, da non confondere con la ridondanza del codice, intendo il fatto che ci sono delle parole nel codice che non vengono utilizzate, in particolare sono le configurazioni: \( 1010, 1011, 1100, \) \( 1101, 1110, 1111 \). Per mostrare queste problematiche facciamo un paio di esempi di somma.

Supponiamo di voler sommare in decimale \( 3 + 11 \)

$$ \begin{array}{r} 3 & +\\ 11 & =\\ \hline 14 & \end{array} $$

$$ \begin{array}{rr} & 0011 & +\\ 0001 & 0001 & =\\ \hline \underbrace{0001}_1 & \underbrace{0100}_4 & \end{array} $$

Come vedete, in questo semplice caso, l'algoritmo della somma per colonne funziona correttamente come nel caso classico. Evidentemente ciò è dovuto alla non presenza di riporti nelle somme elementari che generano risultati in perfetto accordo con la codifica. Naturalmente ci sono dei casi in cui il procedimento si blocca per quanto detto rispetto alla pseudo-ridondanza. Vediamo più in dettaglio di cosa si tratta.

Supponiamo di voler sommare in decimale \( 150 + 53 \)

$$ \begin{array}{r} 150 & +\\ 53 & =\\ \hline 203 & \end{array} $$

$$ \begin{array}{rrr} 0001 & 0101 & 0000 & +\\ & 0101 & 0011 & =\\ \hline \underbrace{0001}_1 & \underbrace{1010}_? & \underbrace{0011}_3 & \end{array} $$

In questo caso la somma delle unità 0 + 3 nella colnna più a destra non da problemi; i problemi subentrano nella somma di 5 + 5 la quale genera un riporto cui corrisponde nel sistema binario la seguente parola di codice: \( 1010 \) che corrisponde ovviamente al \( 10 \) in decimale. Come avrete intuito questa parola di codice non fa parte della tavola di codifica ma ricade nelle parole esterne non utilizzate. Di conseguenza la somma non è compatibile con quella decimale, infatti nella colonna centrale della somma BCD ci si attenderebbe la parola \( 0000 \) per compatibilità con la somma decimale, ivece abbiamo ottenuto \( 1010 \), lo stesso per l'ultima colonna a sinistra (ci dovrebbe essere un 2 ma c'è un 1). Come si risolve questa "apparente" incompatibilità con l'algoritmo della somma?

$$ \diamond $$