Una piccola raccolta di progetti e di idee

Convertire un numero in formato binario in formato packed BCD

Novembre 29th, 2006 Posted in algoritmi, bcd, tutorial

Un 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 = 8)

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 = 8)

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.