Addizione, sottrazione, moltiplicazione e divisione funzionano anche nel sistema binario. La logica è la stessa imparata con i numeri decimali: si allineano le posizioni, si lavora da destra verso sinistra quando necessario e si gestiscono riporti, prestiti e risultati parziali. La differenza è che in base 2 esistono soltanto le cifre 0 e 1.

Il NIST definisce il bit come una cifra binaria con valore 0 oppure 1. Una stringa di bit è una sequenza ordinata nella quale il bit più significativo si trova a sinistra e quello meno significativo a destra. Questa disposizione è fondamentale: ogni colonna possiede un peso doppio rispetto alla colonna immediatamente alla sua destra.

Prima regola: allineare correttamente le posizioni

Nelle operazioni in colonna, le cifre con lo stesso peso devono essere una sotto l'altra. La colonna di 2⁰ va sotto 2⁰, quella di 2¹ sotto 2¹ e così via. È esattamente ciò che facciamo nel sistema decimale quando allineiamo unità, decine e centinaia.

Gli zeri iniziali possono essere aggiunti senza cambiare il valore di un intero senza segno. Per esempio, 1101 e 01101 indicano entrambi 13. Gli zeri sono utili per rendere visibile l'allineamento o per lavorare con parole di lunghezza fissa.

Infografica con addizione, sottrazione, moltiplicazione e divisione nel sistema binario Le quattro operazioni seguono la logica del sistema decimale, ma ogni colonna usa soltanto 0 e 1 ed è basata su potenze di 2.

Addizione binaria: quattro casi fondamentali

Le regole di base sono poche:

  • 0 + 0 = 0;
  • 0 + 1 = 1;
  • 1 + 0 = 1;
  • 1 + 1 = 10₂: si scrive 0 e si riporta 1;
  • 1 + 1 + 1 = 11₂: si scrive 1 e si riporta 1.

Il punto che inizialmente sorprende è 1 + 1 = 10₂. In decimale, uno più uno vale 2. Il sistema binario non possiede la cifra 2, quindi quel valore viene scritto come una unità nella colonna successiva e zero nella colonna corrente: proprio 10₂.

Esempio completo: 1011 + 1101

Allineiamo i numeri e procediamo da destra verso sinistra:

1011 + 1101 ------- 11000
  • prima colonna: 1 + 1 = 10, scrivo 0 e riporto 1;
  • seconda colonna: 1 + 0 + 1 di riporto = 10;
  • terza colonna: 0 + 1 + 1 di riporto = 10;
  • quarta colonna: 1 + 1 + 1 di riporto = 11, scrivo 1 e porto il riporto finale a sinistra.

Il risultato è 11000₂. La verifica decimale conferma il calcolo: 11 + 13 = 24.

Addizione binaria passo passo tra 1011 e 1101 con riporti Quando una colonna raggiunge il valore decimale 2 o 3, la scrittura binaria produce una cifra corrente e un riporto verso sinistra.

Dove va il riporto?

Il riporto appartiene sempre alla colonna successiva a sinistra, perché quella colonna vale il doppio. Se nella colonna di 2⁰ otteniamo 2, non possiamo lasciare il valore 2 nella stessa posizione. Lo riscriviamo come 0 × 2⁰ + 1 × 2¹. Quel nuovo 1 deve quindi essere sommato nella colonna di 2¹.

Il riporto finale non va perduto. Se, dopo aver elaborato la colonna più a sinistra, rimane 1, esso diventa una nuova cifra davanti al risultato.

Schema che mostra il percorso del riporto nell'addizione binaria Ogni riporto viene scritto sopra la colonna immediatamente successiva a sinistra; l'ultimo diventa una nuova cifra.

Sottrazione binaria: il prestito vale 10₂

Anche la sottrazione usa poche regole:

  • 0 - 0 = 0;
  • 1 - 0 = 1;
  • 1 - 1 = 0;
  • per 0 - 1 serve un prestito dalla colonna a sinistra.

Nel sistema decimale, chiedere un prestito trasforma 0 unità in 10 unità. In base 2, una unità della colonna successiva vale due unità della colonna corrente. Perciò il prestito trasforma 0 in 10₂, e 10₂ - 1₂ = 1₂.

Esempio: 1101 - 0110

1101 - 0110 ------- 0111

Il risultato è 111₂, cioè 7 in decimale. Il controllo è immediato: 13 - 6 = 7.

Quando il bit immediatamente a sinistra è 0, il prestito deve propagarsi ancora più a sinistra fino a incontrare un 1. Quel 1 diminuisce a 0; gli zeri attraversati diventano temporaneamente 1 dopo aver ceduto il prestito alla colonna successiva. È lo stesso meccanismo della sottrazione decimale attraverso più zeri, adattato alla base 2.

La sottrazione come addizione del complemento a 2

Nei circuiti digitali è conveniente riutilizzare l'hardware dell'addizione. Per una parola a larghezza fissa, sottrarre B da A può essere trasformato in:

A - B = A + complemento_a_2(B)

Il complemento a 2 di un valore si ottiene, alla larghezza scelta, invertendo tutti i bit e aggiungendo 1. Su 4 bit, il complemento a 2 di 0110 è 1010. Quindi:

1101 + 1010 ------- 1 0111

Scartando il riporto esterno alla parola di 4 bit rimane 0111, cioè 7. Questa tecnica collega direttamente aritmetica binaria, numeri con segno e funzionamento dell'unità aritmetico-logica.

Moltiplicazione binaria: prodotti parziali e spostamenti

Le regole elementari della moltiplicazione sono ancora più semplici:

  • 0 × 0 = 0;
  • 0 × 1 = 0;
  • 1 × 0 = 0;
  • 1 × 1 = 1.

Ogni cifra del moltiplicatore genera un prodotto parziale. Se la cifra è 0, il prodotto parziale è tutto zero. Se è 1, il prodotto parziale è una copia del moltiplicando. Spostandosi verso sinistra nel moltiplicatore, il prodotto parziale viene spostato dello stesso numero di posizioni.

Esempio: 101 × 11

101 × 11 ----- 101 + 1010 ----- 1111

101₂ vale 5 e 11₂ vale 3. Il risultato 1111₂ vale 15, quindi il controllo decimale è 5 × 3 = 15.

Lo spostamento di una posizione a sinistra moltiplica un intero senza segno per 2, purché sia disponibile spazio sufficiente. Per esempio, 101₂ << 1 = 1010₂. In una parola di lunghezza fissa, però, i bit che escono a sinistra possono andare perduti: per questo bisogna sempre considerare la larghezza e l'eventuale overflow.

Divisione binaria: confronto, sottrazione e resto

La divisione in colonna segue la stessa idea della divisione decimale. Si confronta il divisore con la parte corrente del dividendo. Se il divisore entra, si scrive 1 nel quoziente e lo si sottrae; se non entra, si scrive 0. Poi si porta giù la cifra successiva.

Esempio semplice: 1100 ÷ 10

1100₂ vale 12 e 10₂ vale 2. Il quoziente è 110₂, cioè 6, con resto 0.

Dividere un intero positivo senza segno per 10₂ equivale a spostare i bit di una posizione a destra. L'eventuale bit eliminato a destra rappresenta il resto della divisione per 2.

Esempio con resto: 10111 ÷ 11

10111₂ vale 23 e 11₂ vale 3. La divisione produce:

10111₂ ÷ 11₂ = 111₂ con resto 10₂.

In decimale: 23 = 3 × 7 + 2. Il resto deve essere sempre minore del divisore; infatti 10₂ vale 2 ed è minore di 11₂, che vale 3.

Spostamenti: moltiplicare e dividere per potenze di 2

Per interi non negativi e in assenza di overflow:

  • uno spostamento a sinistra moltiplica per 2;
  • due spostamenti a sinistra moltiplicano per 4;
  • uno spostamento a destra divide interamente per 2;
  • k spostamenti corrispondono a moltiplicare o dividere per 2ᵏ.

Con numeri con segno occorre maggiore cautela. Uno spostamento destro logico inserisce zeri a sinistra; uno spostamento destro aritmetico tende invece a replicare il bit più significativo per conservare il segno. Il comportamento preciso dipende dall'architettura e dal linguaggio.

Larghezza fissa, riporto e overflow

Sulla carta possiamo aggiungere una nuova cifra ogni volta che serve. Un registro reale possiede invece una larghezza definita. Su 4 bit senza segno:

1111 + 0001 ------- 1 0000

Il valore matematico è 16, ma quattro bit possono rappresentare soltanto da 0 a 15. Se si conservano solo i quattro bit meno significativi, rimane 0000 e il riporto esterno segnala che il risultato non entra nella parola.

Il riporto e l'overflow con segno non sono la stessa cosa. Su 4 bit in complemento a 2:

0111 (+7) + 0001 (+1) ------- 1000

1000 rappresenta -8 su 4 bit, mentre il risultato matematico sarebbe +8, non rappresentabile nell'intervallo da -8 a +7. Qui si verifica overflow con segno anche senza un riporto finale esterno.

Che cosa fa la CPU?

La CPU non esegue le operazioni scrivendo colonne come su un quaderno. Usa circuiti combinatori e sequenziali costruiti con porte logiche. Sommatori completi elaborano bit, riporti in ingresso e riporti in uscita; registri mantengono gli operandi e il risultato; circuiti di controllo selezionano l'operazione richiesta.

Nell'architettura Intel, il manuale ufficiale descrive istruzioni distinte come ADD, ADC — addizione con riporto —, SUB, SBB — sottrazione con prestito —, oltre alle istruzioni di moltiplicazione e divisione. Queste istruzioni aggiornano indicatori di stato, fra cui carry e overflow, che consentono di proseguire calcoli più larghi di un singolo registro o rilevare risultati non rappresentabili.

Verificare gli esempi con Python

Python permette di scrivere letterali binari con il prefisso 0b. Le normali operazioni aritmetiche producono interi; bin() mostra poi il risultato in base 2.

a = 0b1011 b = 0b1101 print(bin(a + b)) # 0b11000 print(bin(a - 0b0110)) # 0b101 print(bin(0b101 * 0b11))# 0b1111 q, r = divmod(0b10111, 0b11) print(bin(q), bin(r)) # 0b111 0b10

Python usa interi a precisione arbitraria, quindi non simula automaticamente l'overflow di un registro a 4 o 8 bit. Per studiare una larghezza fissa è necessario applicare una maschera, per esempio & 0b1111 per conservare solo quattro bit.

Errori frequenti

  • Non allineare le cifre a destra: si sommano o sottraggono pesi diversi.
  • Lasciare il riporto nella stessa colonna: deve passare alla colonna a sinistra.
  • Dimenticare di ridurre la colonna da cui si prende il prestito: il prestito non è gratuito.
  • Non spostare i prodotti parziali: ogni posizione del moltiplicatore possiede un peso differente.
  • Confondere quoziente e resto: il resto deve essere minore del divisore.
  • Ignorare la larghezza: un risultato corretto matematicamente può non essere rappresentabile nel registro disponibile.
  • Confondere carry e overflow: il primo riguarda soprattutto l'aritmetica senza segno; il secondo l'intervallo dei numeri con segno.

Domande frequenti

Perché 1 + 1 non dà 2?

Il valore è due in decimale, ma in base 2 viene scritto 10, perché non esiste una cifra singola “2”.

Quando il riporto finale diventa una nuova cifra?

Quando si lavora con numeri di lunghezza variabile. In un registro a larghezza fissa può invece restare fuori dal risultato ed essere conservato in un indicatore di carry.

Moltiplicare per 10₂ significa moltiplicare per dieci?

No. 10₂ vale 2 in decimale. Moltiplicare per 10₂ significa moltiplicare per 2.

La divisione binaria può avere un resto?

Sì. Come in base 10, se il dividendo non è un multiplo esatto del divisore, si ottengono quoziente e resto.

Perché la CPU usa il complemento a 2 per sottrarre?

Perché permette di trasformare la sottrazione in un'addizione e riutilizzare gran parte dello stesso circuito aritmetico.

Fonti ufficiali e approfondimenti