Convertire un numero in formato binario in formato packed BCD
Novembre 29th, 2006 Posted in algoritmi, bcd, tutorialUn problema che si presenta spesso nella programmazione dei microcontrollori è quello di dover convertire un numero binario in formato BCD. Il BCD è un particolare metodo di rappresentazione numerica che consiste nell’assegnare un byte ad ogni cifra decimale del numero in ingresso contenente proprio il valore di quella cifra decimale.
Ad esempio:
Decimale: 1478
BCD: 00000001 00000100 00000111 00001000
1 4 7 8
Il sistema è semplice ma è poco efficiente in quanto “spreca” un sacco di spazio. Il motivo è intuitivo: utilizzo un byte, cioè 8 bit, per rappresentare un numero decimale che richiede al massimo 4 bit. E’ ovvio che 4 bit vanno sprecati. Proprio per ridurre il numero di bit utilizzati di solito si utilizza, al posto del formato BCD normale, il packed BCD. Quest’ultimo è identico al BCD normale ma utilizza 4 bit per ogni cifra decimale che si intende rappresentare.
Ogni byte quindi rappresenta due cifre decimali.
Decimale: 1478
BCD: 0001 0100 0111 1000
1 sp(2) 4 sp(2) 7 sp(2) 8
Algoritmo di conversione Binario / Packed BCD
Si considera la seguente tabella:
|
Operazione |
Centinaia |
Decine |
Unità |
Binario |
|
N° in esadecimale |
F |
F |
||
|
Inizio |
1111 |
1111 |
1. n = n° di bit del numero in binario (ad esempio: 1110011 –> n = 7)
2. Si shifta a sinistra di una posizione il numero
3. Se sono stati eseguiti n shift allora il numero in formato packed BCD è nelle colonne Centinaia, Decine, Unità
4. Se almeno uno dei numeri nelle colonne Centinaia, Decine, Unità è maggiore o uguale a 5 allora aggiungo 3 a quel numero.
5. Vai al punto 2
Esempio: conversione in BCD del numero 227 ( E3 in esadecimale, 11100011 in binario, n =
|
Operazione |
Centinaia |
Decine |
Unità |
Binario |
Binario |
|
N° in esadecimale |
E |
3 |
|||
|
Inizio |
1110 |
0011 |
|||
| Shift n° 1 |
1 |
1100 |
011 |
||
| Shift n° 2 |
11 |
1000 |
11 |
||
| Shift n° 3 |
111 |
0001 |
1 |
||
| Aggiungo 3 |
1010 |
0001 |
1 |
||
| Shift n° 4 |
1 |
0100 |
0011 |
||
| Shift n° 5 |
10 |
1000 |
011 |
||
| Aggiungo 3 |
10 |
1011 |
011 |
||
| Shift n° 6 |
101 |
0110 |
11 |
||
| Aggiungo 3 |
1000 |
1001 |
11 |
||
| Shift n° 7 |
1 |
0001 |
0011 |
1 |
|
| Shift n° 8 |
10 |
0010 |
0111 |
Esempio: conversione in BCD del numero 56 (38 in esadecimale, 00111000 in binario, n =
|
Operazione |
Centinaia |
Decine |
Unità |
Binario |
Binario |
|
N° in esadecimale |
3 |
8 |
|||
|
Inizio |
0011 |
1000 |
|||
| Shift n° 1 |
0 |
0111 |
000 |
||
| Shift n° 2 |
00 |
1110 |
00 |
||
| Shift n° 3 |
001 |
1100 |
0 |
||
| Shift n° 4 |
0011 |
1000 |
|||
| Shift n° 5 |
0 |
0111 |
000 |
||
| Aggiungo 3 |
0 |
1010 |
000 |
||
| Shift n° 6 |
01 |
0100 |
00 |
||
| Shift n° 7 |
010 |
1000 |
0 |
||
| Aggiungo 3 |
010 |
1011 |
0 |
||
| Shift n° 8 |
0101 |
0110 |
Esempio: conversione in BCD del numero 56 (38 in esadecimale, 111000 in binario, n = 6)
|
Operazione |
Centinaia |
Decine |
Unità |
Binario |
Binario |
|
N° in esadecimale |
3 |
8 |
|||
|
Inizio |
11 |
1000 |
|||
| Shift n° 1 |
1 |
11 |
000 |
||
| Shift n° 2 |
11 |
10 |
00 |
||
| Shift n° 3 |
111 |
00 |
0 |
||
| Aggiungo 3 |
1010 |
00 |
0 |
||
| Shift n° 4 |
1 |
0100 |
0 |
||
| Shift n° 5 |
10 |
1000 |
|||
| Aggiungo 3 |
10 |
1011 |
|||
| Shift n° 6 |
101 |
0110 |
NB :
Se dopo l’ n-esimo shift il campo delle decine non è nullo e il campo delle unità è composto
da meno di 4 cifre allora è necessario aggiungere degli 0 a destra.
Esempio: conversione in BCD del numero 57 (39 in esadecimale, 111001 in binario, n = 6)
|
Operazione |
Centinaia |
Decine |
Unità |
Binario |
Binario |
|
N° in esadecimale |
3 |
9 |
|||
|
Inizio |
11 |
1001 |
|||
| Shift n° 1 |
1 |
11 |
001 |
||
| Shift n° 2 |
11 |
10 |
01 |
||
| Shift n° 3 |
111 |
00 |
1 |
||
| Aggiungo 3 |
1010 |
00 |
1 |
||
| Shift n° 4 |
1 |
0100 |
01 |
||
| Shift n° 5 |
10 |
1000 |
1 |
||
| Aggiungo 3 |
10 |
1011 |
1 |
||
| Shift n° 6 |
101 |
0111 |
Esempio: conversione in BCD del numero 4294967295 (FFFFFFFF in esadecimale, 11111111111111111111111111111111 in binario, n = 32)
Schema a blocchi dell’algoritmo

NOTA:
nello scrivere questa pagina ho preso più di uno spunto da questo url.
You must be logged in to post a comment.