Capire come convertire i numeri decimali (quelli che utilizziamo ogni giorno) in numeri binari (utilizzati dai computer) è una competenza fondamentale in informatica. Nel sistema binario, la posizione di ogni cifra rappresenta una potenza specifica di due. Possiamo pensare a un numero binario come a un modo per indicare quali potenze di due sono necessarie affinché la loro somma corrisponda al numero dato.
Numero in base-10
128
64
32
16
8
4
2
1
Somma
114
0
1
1
1
0
0
1
0
114 = 64 + 32 + 16 + 2
12
0
0
0
0
1
1
0
0
12 = 8 + 4
13
0
0
0
0
1
1
0
1
13 = 8 + 4 + 1
Ogni 1 nella rappresentazione binaria indica che la corrispondente potenza di due fa parte della somma, mentre ogni 0 indica il contrario. Il bello del sistema binario sta nella sua semplicità e unicità.
💡
Ogni numero ha una e una sola rappresentazione binaria, composta da una somma di potenze di due distinte.
Trovare il bit più a destra
Per cominciare, consideriamo come trovare il bit più a destra nella rappresentazione binaria di un numero. Nel sistema decimale, per ottenere l’ultima cifra di un numero basta calcolare il resto della divisione per 10, spesso indicato come % 10 nei linguaggi di programmazione. Allo stesso modo, in binario, il bit più a destra si trova calcolando il resto della divisione del numero per 2, o % 2. Questo significa anche che il bit più a destra è sempre 1 per i numeri dispari e 0 per i numeri pari.
Ad esempio:
Per 114 il bit più a destra è 0, poiché 114 % 2 = 0.
Per 13 il bit più a destra è 1, poiché 13 % 2 = 1.
Spostare un numero binario
Dopo aver trovato il bit più a destra, il passo successivo è spostare l’intero numero binario di una posizione a destra. Questa operazione equivale alla divisione intera del numero per 2 (in molti linguaggi indicata come / 2 o // 2 in Python). In questo modo si rimuove il bit più a destra, e il successivo diventa il nuovo bit più a destra.
Spostare 114 ( in binario) a destra produce , che in base-10 è 114 / 2 = 57.
Spostare 13 ( in binario) a destra produce , che in base-10 è 13 / 2 = 6.
L’algoritmo di conversione
Avendo a disposizione queste due operazioni (trovare il bit più a destra e spostare il numero), possiamo definire un semplice algoritmo per convertire un numero decimale in binario:
Inizializzare una stringa vuota per memorizzare la rappresentazione binaria.
Finché il numero è maggiore di 0:
Trovare il bit più a destra calcolando il resto della divisione per 2.
Aggiungere questo bit a sinistra della stringa binaria.
Dividere il numero per 2 (divisione intera) per spostarlo a destra.
Restituire la stringa binaria se non è vuota, altrimenti 0.
Utilizzando questo algoritmo, è possibile convertire qualsiasi numero in base-10 nella sua unica rappresentazione binaria.
Implementazione minimale
b, d = '101001101', 0 # numeri binari e decimali
power = 1 # Potenza corrente di 2 (1, 2, 4, 8, 16, ...)
for bi in b[::-1]: # Si itera dal bit meno significativo a quello più significativo
d += int(bi) * power
power *= 2
print(d)
binary → decimal conversion
b, d = '', 5234 # numeri binari e decimali
while d > 0: # Finché ci sono bit da elaborare
b = str(d % 2) + b # Inserisce il bit a sinistra della stringa
d //= 2 # Sposta il numero a destra
print(b if b != '' else 0)