Il sistema decimale e il sistema binario rappresentano gli stessi numeri usando alfabeti diversi. Nel sistema decimale disponiamo delle dieci cifre da 0 a 9; nel sistema binario ne usiamo soltanto due, 0 e 1. Cambia la scrittura, ma non cambia la quantità rappresentata: il numero decimale 13 e il numero binario 1101 indicano lo stesso valore.
Il NIST definisce il bit come una cifra binaria che può assumere valore 0 oppure 1. Una sequenza ordinata di bit può essere interpretata come un intero senza segno, ma il significato dipende sempre dal contesto. Comprendere la conversione tra base 10 e base 2 significa quindi capire il principio posizionale, non imparare una tabella a memoria.
Che cosa significa “base” di un sistema numerico?
La base indica quante cifre elementari sono disponibili e determina il peso delle posizioni. In base 10, ogni posizione vale una potenza di 10: unità, decine, centinaia e così via. In base 2, ogni posizione vale una potenza di 2.
Partendo da destra, le posizioni binarie hanno peso:
2⁰ = 1, 2¹ = 2, 2² = 4, 2³ = 8, 2⁴ = 16, ...
La cifra più a destra è il bit meno significativo, spesso abbreviato in LSB; quella più a sinistra è il bit più significativo, o MSB. Il glossario NIST sulle stringhe di bit usa proprio questa convenzione: il bit più significativo è mostrato a sinistra e quello meno significativo a destra.
Le divisioni successive per 2 producono le cifre binarie; nel percorso inverso ogni cifra viene moltiplicata per il peso della propria posizione.
Da binario a decimale: sommare i pesi delle posizioni
Per convertire un numero binario in decimale si parte dalla posizione più a destra, numerata 0. Ogni cifra viene moltiplicata per la corrispondente potenza di 2. I risultati vengono poi sommati.
Prendiamo 1001₂:
1 × 2³ + 0 × 2² + 0 × 2¹ + 1 × 2⁰
8 + 0 + 0 + 1 = 9
Quindi 1001₂ = 9₁₀. Gli zeri non eliminano il peso della posizione: indicano semplicemente che quel peso non viene incluso nella somma. La posizione corrispondente a 2¹ vale 2, ma poiché la cifra è 0, il contributo è 0 × 2 = 0.
Ogni 1 attiva il peso della posizione; ogni 0 lo lascia fuori dalla somma.
Un metodo rapido da sinistra verso destra
Esiste anche un procedimento equivalente che evita di scrivere tutte le potenze. Si legge il numero da sinistra a destra, raddoppiando ogni volta il risultato parziale e aggiungendo la cifra successiva.
Per 1101₂:
- parto da 1;
- 1 × 2 + 1 = 3;
- 3 × 2 + 0 = 6;
- 6 × 2 + 1 = 13.
Questo metodo funziona perché spostarsi di una posizione verso sinistra in base 2 equivale a moltiplicare per 2, proprio come spostarsi a sinistra in base 10 equivale a moltiplicare per 10.
Da decimale a binario: divisioni successive per 2
Per trasformare un intero positivo da base 10 a base 2 si divide ripetutamente per 2. A ogni passaggio si annotano il quoziente intero e il resto. Poiché si divide per 2, il resto può essere soltanto 0 oppure 1.
Convertiamo 13:
- 13 ÷ 2 = 6, resto 1;
- 6 ÷ 2 = 3, resto 0;
- 3 ÷ 2 = 1, resto 1;
- 1 ÷ 2 = 0, resto 1.
Leggendo i resti dall'ultimo al primo otteniamo 1101₂.
Perché i resti si leggono dal basso verso l'alto?
Questo passaggio non è una regola arbitraria. Ogni divisione produce una relazione del tipo:
n = 2 × quoziente + resto
Il primo resto indica se il numero contiene un'unità binaria, cioè il peso 2⁰. È quindi la cifra più a destra. Dividendo il quoziente una seconda volta si trova la cifra di 2¹; poi quella di 2² e così via. Le cifre vengono scoperte dalla meno significativa alla più significativa, ma un numero si scrive dalla più significativa alla meno significativa. Per questo l'ordine finale è inverso rispetto all'ordine di scoperta.
Il primo resto corrisponde a 2⁰, il secondo a 2¹ e così via: vengono trovate prima le cifre di destra.
La dimostrazione con il numero 9
Le divisioni producono i resti 1, 0, 0, 1. Il primo è il coefficiente di 2⁰, il secondo di 2¹, il terzo di 2² e il quarto di 2³. Scrivendo le posizioni nel loro ordine normale, da 2³ a 2⁰, si ottiene 1001₂.
Il caso speciale dello zero
Se il numero iniziale è 0, il ciclo delle divisioni non parte. Tuttavia la sua rappresentazione binaria non è una stringa vuota: è 0. Nei programmi bisogna quindi trattare esplicitamente questo caso oppure progettare il ciclo in modo che produca almeno una cifra.
Gli zeri iniziali cambiano il valore?
Per un numero binario senza segno, gli zeri a sinistra non cambiano il valore: 101, 0101 e 00000101 rappresentano tutti il numero 5. Possono però essere importanti quando si lavora con una larghezza fissa, per esempio 8, 16 o 32 bit, perché indicano quanti bit sono riservati alla rappresentazione.
Un byte è una sequenza di otto bit. In otto bit senza segno, il valore minimo è 0 e il massimo è 255, cioè 11111111₂.
La prima cifra a sinistra indica sempre il segno?
No. Questa è una delle confusioni più comuni. In una normale conversione scolastica, se non viene specificato altro, il numero è considerato senza segno. In questo caso 1001₂ vale 9, non -9. Il primo 1 rappresenta il peso 2³.
Il significato cambia soltanto quando viene dichiarata una rappresentazione con segno e una larghezza precisa. Nei computer moderni gli interi con segno sono normalmente rappresentati in complemento a 2. Con 4 bit:
- 0101₂ rappresenta +5;
- 1011₂ rappresenta -5 in complemento a 2.
La cifra più a sinistra indica un valore negativo soltanto quando la rappresentazione con segno e la larghezza sono note.
Una precisazione importante sul “bit di segno”
Nel complemento a 2 si dice spesso, per semplicità, che il bit più a sinistra è il bit di segno. È utile come prima idea, ma non è un semplice simbolo separato come il segno meno scritto davanti a un numero decimale. In una parola di n bit, il bit più a sinistra ha peso negativo -2ⁿ⁻¹, mentre gli altri mantengono i pesi positivi.
Per esempio, su 4 bit:
1011₂ = -8 + 0 + 2 + 1 = -5
Questa interpretazione vale solo perché abbiamo dichiarato: “numero con segno in complemento a 2 su 4 bit”. La stessa sequenza 1011, interpretata senza segno, vale 11. Una stringa di bit non porta da sola il proprio significato: servono formato e contesto.
Intervalli rappresentabili
Con n bit senza segno si rappresentano i valori da 0 a 2ⁿ - 1. Con n bit in complemento a 2 si rappresentano i valori da -2ⁿ⁻¹ a 2ⁿ⁻¹ - 1.
- 4 bit unsigned: da 0 a 15;
- 4 bit signed in complemento a 2: da -8 a +7;
- 8 bit unsigned: da 0 a 255;
- 8 bit signed in complemento a 2: da -128 a +127.
Controllare il risultato con Python
Il metodo manuale serve a capire il meccanismo; un linguaggio di programmazione può poi verificare il risultato. La documentazione ufficiale Python definisce bin() per ottenere una stringa binaria e int(testo, 2) per interpretare una stringa in base 2.
bin(13) # '0b1101' int("1101", 2) # 13Il prefisso 0b segnala che la scrittura è binaria. Attenzione però ai negativi: bin(-5) restituisce -0b101, cioè una rappresentazione testuale con il segno meno, non una parola a larghezza fissa in complemento a 2. Per ottenere, per esempio, la forma a 8 bit di -5 bisogna scegliere esplicitamente la larghezza e applicare la maschera appropriata.
Errori frequenti nelle conversioni
- Partire dalla potenza 1 anziché dalla potenza 0: la posizione più a destra vale sempre 2⁰.
- Leggere i resti nello stesso ordine in cui vengono trovati: così si rovescia il numero.
- Dimenticare il caso 0: il risultato deve essere la cifra 0.
- Usare pesi decimali: in binario le posizioni valgono 1, 2, 4, 8, 16 e non 1, 10, 100.
- Considerare ogni 1 iniziale come segno negativo: il segno esiste soltanto in una rappresentazione con segno dichiarata.
- Confondere valore e codifica: la stessa stringa può avere interpretazioni diverse in base al formato.
Domande frequenti
Perché dividiamo proprio per 2?
Perché stiamo convertendo in base 2. La divisione per la base separa il quoziente dalle unità della posizione corrente.
Posso convertire usando soltanto le potenze di 2?
Sì. Si può sottrarre dal numero la potenza di 2 più grande possibile e segnare 1 nelle posizioni utilizzate. Le divisioni successive sono però un metodo sistematico e facile da automatizzare.
Come verifico velocemente una conversione?
Riconverti il risultato in decimale sommando i pesi. Se ottieni il numero iniziale, la conversione è coerente.
Questo metodo vale anche per i numeri con la virgola?
La parte intera usa le divisioni per 2. Per la parte frazionaria si applicano moltiplicazioni successive per 2: è un procedimento diverso che merita un approfondimento separato.