💾 Elettronica digitale · Guida 02

Sistema binario, esadecimale, bit e byte

I circuiti digitali lavorano con bit, ma per leggere registri, indirizzi, maschere e dati è utile saper passare rapidamente tra sistema binario, decimale ed esadecimale. In questa guida partiamo da bit e byte e arriviamo alle conversioni più importanti, con esempi pratici utili anche nella programmazione di Arduino e microcontrollori.

Livello: base Binario Esadecimale Bit e byte

Cos’è un bit?

Il bit, abbreviazione di binary digit, è l’unità minima dell’informazione digitale. Può assumere soltanto due valori:

0 oppure 1

In un circuito elettronico questi valori vengono rappresentati tramite livelli logici LOW e HIGH. Il bit non è quindi una tensione specifica, ma uno stato logico.

Un singolo bit può rappresentare due possibilità. Per esempio: spento/acceso, falso/vero, LOW/HIGH.

Nibble, byte, word

Per rappresentare più informazioni i bit vengono raggruppati.

GruppoNumero di bitCombinazioni
Bit12
Nibble416
Byte8256
WordDipende dall’architetturaDipende dal numero di bit
Un byte è formato da 8 bit. Può rappresentare 256 combinazioni differenti, da 0 a 255 se interpretato come intero senza segno.

I pesi dei bit in un byte

Nel sistema binario ogni posizione ha un peso pari a una potenza di 2. Nel byte, partendo dal bit meno significativo:

1282⁷
642⁶
322⁵
162⁴
8
4
2
12⁰
MSB e LSB L’MSB è il bit più significativo, con peso maggiore. L’LSB è il bit meno significativo, con peso minore.

Pesi dei bit in un byte

Pesi dei bit in un byte con MSB, LSB e potenze di 2
Pesi dei singoli bit in un byte a 8 bit, dal bit più significativo MSB al bit meno significativo LSB.

Come funziona il sistema binario?

Il sistema decimale usa dieci simboli, da 0 a 9. Il sistema binario usa soltanto 0 e 1 e ogni posizione rappresenta una potenza di 2.

… 2⁵   2⁴   2³   2²   2¹   2⁰
Esempio Il numero binario 1011 significa:

1×8 + 0×4 + 1×2 + 1×1 = 11.

Conversione da binario a decimale

Per convertire un numero binario in decimale basta sommare i pesi delle posizioni in cui compare un 1.

Convertiamo 110101₂

1×32 + 1×16 + 0×8 + 1×4 + 0×2 + 1×1

32 + 16 + 4 + 1 = 53.
110101₂ = 53₁₀

Conversione da decimale a binario

Un metodo semplice consiste nel cercare quali potenze di 2 devono essere sommate per ottenere il numero desiderato.

Convertiamo 45 in binario

45 = 32 + 8 + 4 + 1
Pesi: 32, 16, 8, 4, 2, 1
Bit:   1   0   1  1  0  1

45₁₀ = 101101₂.
Altro metodo Si può dividere ripetutamente il numero per 2 e leggere i resti dal basso verso l’alto.

Perché esiste il sistema esadecimale?

Scrivere numeri binari lunghi è scomodo e facilita gli errori. Il sistema esadecimale usa base 16 e permette di rappresentare gruppi di 4 bit con un solo simbolo.

1 cifra esadecimale = 4 bit

Dopo le cifre da 0 a 9 vengono utilizzate le lettere A, B, C, D, E e F.

Tabella binario, decimale ed esadecimale

BinarioDecimaleEsadecimale
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F

Conversione binario ↔ esadecimale

La conversione è particolarmente semplice perché ogni cifra esadecimale corrisponde esattamente a quattro bit.

Binario → esadecimale 1101 0110

1101 = D
0110 = 6

Quindi 11010110₂ = D6₁₆.
Esadecimale → binario 3A

3 = 0011
A = 1010

Quindi 3A₁₆ = 00111010₂.
Un byte corrisponde esattamente a due cifre esadecimali. Per esempio: 11111111₂ = FF₁₆ = 255₁₀.

Binario, decimale ed esadecimale a confronto

Confronto tra sistema binario decimale ed esadecimale
Confronto tra rappresentazione binaria, decimale ed esadecimale con esempi di conversione e raggruppamento dei bit.

Prefissi 0b e 0x nel codice

Nei linguaggi usati con microcontrollori si possono indicare esplicitamente numeri binari ed esadecimali.

int a = 0b10101010; // binario int b = 0xAA; // esadecimale int c = 170; // decimale // a, b e c rappresentano lo stesso valore
0b indica binario, 0x indica esadecimale. Il valore memorizzato è lo stesso: cambia soltanto il modo in cui lo scriviamo nel sorgente.

Quanti valori posso rappresentare con N bit?

Numero di combinazioni = 2N

Con un intero senza segno, il valore minimo è 0 e quello massimo è:

Valore massimo unsigned = 2N − 1
BitCombinazioniRange unsigned
4160–15
82560–255
1010240–1023
1240960–4095
1665.5360–65.535

Numeri con segno e complemento a due

Quando dobbiamo rappresentare anche numeri negativi, nei moderni sistemi digitali viene normalmente utilizzato il complemento a due.

Range signed a N bit = −2N−1 … 2N−1 − 1
8 bit con segno
Minimo = −128
Massimo = +127
Lo stesso pattern di bit può rappresentare valori diversi. Per esempio 11111111 vale 255 se interpretato unsigned, ma −1 se interpretato signed in complemento a due.

Esempi pratici con Arduino

Binario ed esadecimale sono molto utili quando lavoriamo con registri, porte digitali, maschere e protocolli.

byte valore = 0b10100101; // stampa in diversi formati Serial.println(valore, BIN); // 10100101 Serial.println(valore, DEC); // 165 Serial.println(valore, HEX); // A5

Lo stesso dato viene mostrato in tre basi diverse senza cambiare il contenuto memorizzato.

Perché conoscere i bit è importante?

Le operazioni bitwise permettono di modificare singoli bit senza alterare gli altri. Sono fondamentali quando si lavora a basso livello.

OperatoreNomeUso tipico
&ANDMascherare o leggere determinati bit.
|ORImpostare bit a 1.
^XORInvertire selettivamente bit.
~NOTInvertire tutti i bit.
<<Shift sinistroSpostare i bit verso posizioni più significative.
>>Shift destroSpostare i bit verso posizioni meno significative.
Questi operatori verranno approfonditi nelle guide successive. Qui è importante capire che agiscono direttamente sulla rappresentazione binaria del dato.

Errori comuni

  • pensare che un byte possa rappresentare solo 0–255 in qualsiasi situazione;
  • confondere numero di bit e numero di valori rappresentabili;
  • dimenticare che il valore massimo unsigned è 2^N − 1;
  • leggere 0x10 come dieci invece che sedici;
  • confondere una cifra esadecimale con un byte;
  • dimenticare che ogni cifra hex rappresenta quattro bit;
  • interpretare un valore signed come unsigned o viceversa;
  • confondere il valore numerico con il modo in cui viene visualizzato;
  • scrivere numeri binari lunghi senza raggrupparli in nibble;
  • usare operazioni bitwise senza verificare la larghezza del tipo di dato.