Salta al contenuto
Note per Studenti Basi di numerazione e conversioni - binario, ottale ed esadecimale

Basi di numerazione e conversioni - binario, ottale ed esadecimale

In questa pagina 6

Un calcolatore lavora in binario, ma i numeri si scrivono più comodamente in ottale o in esadecimale. Questa nota spiega come passare da una base all'altra e come fare le quattro operazioni elementari in binario. Le versioni "da corso di architettura" sono in Sistemi di numerazione posizionaliNotazione posizionale in base b; conversioni tra base 10, 2, 8 e 16 per interi (divisioni successive) e per parti frazionarie (moltiplicazioni successive); numeri periodici in binario.Sistemi di numerazione posizionali → e Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →; qui l'accento è sul metodo, con ogni passaggio scritto.

Notazione posizionale

In base rr si usano le rr cifre 0,1,…,r−10,1,\dots,r-1. Il valore di una cifra dipende dalla posizione: è il coefficiente di una potenza di rr. Un numero con cifre anan−1…a1a0.a−1a−2…ama_na_{n-1}\dots a_1a_0.a_{-1}a_{-2}\dots a_{m} vale N=∑i=mnai ri.N=\sum_{i=m}^{n}a_i\,r^i . La cifra ana_n è la più significativa (MSB, most significant bit in binario), la ama_m la meno significativa (LSB). La virgola separa la parte intera (esponenti ≥0\ge0) da quella frazionaria (esponenti negativi).

Decimale (r=10r=10): 2719,5310=2⋅103+7⋅102+1⋅101+9⋅100+5⋅10−1+3⋅10−22719{,}53_{10}=2\cdot10^3+7\cdot10^2+1\cdot10^1+9\cdot10^0+5\cdot10^{-1}+3\cdot10^{-2}.

Binario (r=2r=2, cifre 0 e 1). Esempi:

  • 100112=1⋅24+0⋅23+0⋅22+1⋅21+1⋅20=16+2+1=191010011_2=1\cdot2^4+0\cdot2^3+0\cdot2^2+1\cdot2^1+1\cdot2^0=16+2+1=19_{10};
  • 110101,112=32+16+4+1+12+14=53,7510110101{,}11_2=32+16+4+1+\frac12+\frac14=53{,}75_{10}.

Per leggere un binario si sommano le potenze di 2 delle posizioni in cui c'è un 1. Conviene sapere a memoria:

esponente 0 1 2 3 4 5 6 7 8 9 10
2k2^k 1 2 4 8 16 32 64 128 256 512 1024

210=1024≈1032^{10}=1024\approx10^3 (kilo), 220≈1062^{20}\approx10^6 (mega), 230≈1092^{30}\approx10^9 (giga), 240≈10122^{40}\approx10^{12} (tera).

Nota sulle capacità. Il costruttore di un disco usa i prefissi decimali (1 GB=1091\,\mathrm{GB}=10^9 byte), molti sistemi operativi i prefissi binari (1 GB=230=1 073 741 8241\,\mathrm{GB}=2^{30}=1\,073\,741\,824 byte). Un disco da 500 GB500\,\mathrm{GB} decimali vale 500/1,073741824≈465,7500/1{,}073741824\approx465{,}7 GB binari.

Ottale ed esadecimale

Poiché 8=238=2^3 e 16=2416=2^4, una cifra ottale corrisponde esattamente a 3 bit e una esadecimale a 4 bit: sono scritture compatte del binario, lunghe un terzo o un quarto.

  • Ottale (base 8): cifre 00–77; esempio 127,48=1⋅64+2⋅8+7+4⋅8−1=87,510127{,}4_8=1\cdot64+2\cdot8+7+4\cdot8^{-1}=87{,}5_{10}.
  • Esadecimale (base 16): cifre 00–99 e A,B,C,D,E,FA,B,C,D,E,F per 10,…,1510,\dots,15; esempio B65F16=11⋅163+6⋅162+5⋅16+15=45056+1536+80+15=4668710B65F_{16}=11\cdot16^3+6\cdot16^2+5\cdot16+15=45056+1536+80+15=46687_{10}.
dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bin 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
hex 0 1 2 3 4 5 6 7 8 9 A B C D E F

Binario →\to esadecimale. Si formano gruppi di 4 bit partendo dalla virgola (verso sinistra per la parte intera, verso destra per la frazionaria), completando con zeri i gruppi estremi, e si sostituisce ogni gruppo con la sua cifra. Esempio: 0010 1100 0110 1011,1111 0000 01102=2C6B,F06160010\,1100\,0110\,1011{,}1111\,0000\,0110_2=2C6B{,}F06_{16}.

Esadecimale →\to binario. Si sostituisce ogni cifra con i suoi 4 bit: 3A6,C16=0011 1010 0110,11002=1110100110,1123A6{,}C_{16}=0011\,1010\,0110{,}1100_2=1110100110{,}11_2 (si eliminano gli zeri inutili agli estremi). Per l'ottale si fa lo stesso con gruppi di 3 bit.

Da decimale a binario (e ad altre basi)

Parte intera, primo metodo: sottrarre potenze di 2

Si cerca la più grande potenza di 2 che non supera il numero, la si sottrae, e si ripete sul resto fino a ottenere 0. Le posizioni usate sono gli 1.

Esempio: 625625. 625−512=113625-512=113 (292^9); 113−64=49113-64=49 (262^6); 49−32=1749-32=17 (252^5); 17−16=117-16=1 (242^4); 1−1=01-1=0 (202^0). Quindi 625=29+26+25+24+20625=2^9+2^6+2^5+2^4+2^0 e il binario ha un 1 nelle posizioni 9,6,5,4,09,6,5,4,0: 62510=10011100012625_{10}=1001110001_2.

Parte intera, secondo metodo: divisioni per rr

Si divide il numero per la base, si annota il resto, si divide il quoziente, e così via fino al quoziente 00. Il primo resto è la cifra meno significativa: i resti si leggono dal basso verso l'alto. Perché funziona: ogni divisione per rr stacca la cifra a0a_0 (il resto) e sposta tutte le altre di una posizione, come cancellare l'ultima cifra in decimale.

Esempio: 625625 in binario. 625→312625\to312 r 11; 312→156312\to156 r 00; 156→78156\to78 r 00; 78→3978\to39 r 00; 39→1939\to19 r 11; 19→919\to9 r 11; 9→49\to4 r 11; 4→24\to2 r 00; 2→12\to1 r 00; 1→01\to0 r 11. Letti dal basso: 10011100011001110001 ✓ (stesso risultato).

Esempio: 24712471 in ottale. 2471→3082471\to308 r 77; 308→38308\to38 r 44; 38→438\to4 r 66; 4→04\to0 r 44. Dal basso: 247110=464782471_{10}=4647_8. Verifica: 4⋅512+6⋅64+4⋅8+7=2048+384+32+7=24714\cdot512+6\cdot64+4\cdot8+7=2048+384+32+7=2471 ✓.

Parte frazionaria: moltiplicazioni per rr

Si moltiplica la parte frazionaria per 2; la parte intera del prodotto (0 o 1) è la prossima cifra dopo la virgola, a partire dalla più significativa; si ripete sulla nuova parte frazionaria finché si ottiene 00 o si hanno abbastanza cifre.

Esempio: 41,12541{,}125. La parte intera: 41=32+8+1→10100141=32+8+1\to101001. Frazione: 0,125⋅2=0,250{,}125\cdot2=0{,}25 (cifra 00); 0,25⋅2=0,50{,}25\cdot2=0{,}5 (cifra 00); 0,5⋅2=1,00{,}5\cdot2=1{,}0 (cifra 11), residuo 00, stop. Quindi 41,12510=101001,001241{,}125_{10}=101001{,}001_2.

Esempio: 0,40{,}4. 0,4⋅2=0,80{,}4\cdot2=0{,}8 (0); 0,8⋅2=1,60{,}8\cdot2=1{,}6 (1); 0,6⋅2=1,20{,}6\cdot2=1{,}2 (1); 0,2⋅2=0,40{,}2\cdot2=0{,}4 (0): si è tornati a 0,40{,}4, quindi la sequenza si ripete. 0,410=0,0110‾20{,}4_{10}=0{,}\overline{0110}_2 è periodico: non si può scrivere esattamente con un numero finito di bit, solo approssimare. È la ragione per cui un calcolatore non rappresenta esattamente 0,10{,}1 o 0,40{,}4.

Aritmetica binaria elementare

Le operazioni seguono le stesse regole decimali; cambia il valore della base.

Somma

Tabella: 0+0=00+0=0, 0+1=10+1=1, 1+0=11+0=1, 1+1=01+1=0 con riporto 1. Il riporto va sommato alla colonna successiva, dove si possono sommare tre 1 (1+1+1=11+1+1=1 con riporto 11).

Esempio: 011002+10001201100_2+10001_2 (12+1712+17). Colonne da destra: 0+1=10+1=1; 0+0=00+0=0; 1+0=11+0=1; 1+0=11+0=1; 0+1=10+1=1. Risultato 111012=2911101_2=29 ✓.

Esempio con riporti: 101102+10111210110_2+10111_2 (22+2322+23). Da destra: 0+1=10+1=1; 1+1=01+1=0 r1; 1+1+1=11+1+1=1 r1; 0+0+1=10+0+1=1; 1+1=01+1=0 r1; riporto finale 11. Risultato 1011012=45101101_2=45 ✓.

Differenza

Tabella: 0−0=00-0=0, 1−0=11-0=1, 1−1=01-1=0, 0−1=10-1=1 con prestito: si prende un 1 dalla cifra a sinistra del minuendo, che aggiunge 22 alla cifra su cui si lavora (in decimale aggiungerebbe 10).

Esempio: 101102−100102=00100210110_2-10010_2=00100_2 (22−18=422-18=4): le colonne a destra danno 0,1,00,1,0 e le altre 0,00,0 senza prestiti.

Esempio con prestito: 101102−10011210110_2-10011_2 (22−19=322-19=3). Si procede per colonne da destra, portandosi dietro il prestito pp (che vale 1 se la colonna precedente ha chiesto un 1 in prestito):

bit minuendo sottraendo prestito in ingresso calcolo cifra prestito in uscita
0 0 1 0 0−1<00-1<0: si aggiunge 22, 2−1=12-1=1 1 1
1 1 1 1 1−1−1=−1<01-1-1=-1<0: 2−1=12-1=1 1 1
2 1 0 1 1−0−1=01-0-1=0 0 0
3 0 0 0 00 0 0
4 1 1 0 00 0 0

Risultato (dal bit 4 al bit 0) 000112=300011_2=3 ✓. Come controllo si può sempre ripetere l'operazione in decimale e riconvertire.

Se il minuendo è minore del sottraendo si scambiano gli operandi e si mette il segno meno davanti: 100112−111102=−(111102−100112)=−010112=−111010011_2-11110_2=-(11110_2-10011_2)=-01011_2=-11_{10}. Il calcolatore non fa così: usa il complemento a 2 (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →).

Prodotto

Le cifre da moltiplicare sono solo 0 e 1, quindi ogni prodotto parziale è uguale al moltiplicando (se la cifra del moltiplicatore è 1) o a zero (se è 0). I prodotti parziali si traslano a sinistra di una posizione ciascuno e si sommano. In hardware il prodotto di due bit è una porta AND.

Esempio: 10112×10121011_2\times101_2 (11×511\times5): prodotti parziali 10111011 (bit 0), 00000000 (bit 1, traslato di 1), 10111011 (bit 2, traslato di 2): 101100000101100110111cioeˋ 1101112=5510 ✓\begin{array}{r}1011\\0000\phantom{0}\\1011\phantom{00}\\\hline110111\end{array}\qquad\text{cioè }110111_2=55_{10}\ ✓

Altre basi

In generale, per operare in base rr si può passare per il decimale: si convertono gli operandi, si calcola, si riconverte il risultato.

Esempi svolti (esercizi del corso)

richiesta risultato controllo
10110012→1011001_2\to dec 8989 64+16+8+164+16+8+1
387110→3871_{10}\to bin 1111000111112111100011111_2 2048+1024+512+256+16+8+4+2+12048+1024+512+256+16+8+4+2+1
E42916→E429_{16}\to bin 1110 0100 0010 100121110\,0100\,0010\,1001_2 584091058409_{10}
34710→347_{10}\to ottale 5338533_8 5⋅64+3⋅8+35\cdot64+3\cdot8+3
100012+1111210001_2+1111_2 1000002=32100000_2=32 17+1517+15
100012−1111210001_2-1111_2 000102=200010_2=2 17−1517-15
100012×101210001_2\times101_2 10101012=851010101_2=85 17×517\times5

Errori comuni

  • Leggere i resti delle divisioni dall'alto: vanno letti dal basso.
  • Leggere le cifre frazionarie dal basso: vanno lette dall'alto.
  • Raggruppare i bit da sinistra anziché dalla virgola (nei numeri con parte frazionaria o con numero di bit non multiplo di 3/4).
  • Dimenticare di completare con zeri i gruppi estremi (1110100110,11→0011 1010 0110,11001110100110{,}11\to0011\,1010\,0110{,}1100).
  • Scambiare "1 GB decimale" e "1 GB binario".

Versione ripasso

Esercizi su questo argomento

Teoria collegata