IL CODICE BINARIO

a cura di Daniele Timpano

Introduzione

COS'È L'INFORMATICA

Per poter comprendere efficacemente il significato e l’importanza della codifica binaria nel mondo dell’informatica, è necessario fare un piccolo passo indietro e cercare una definizione opportuna per questa scienza. Solo dalla conoscenza dell’informatica e delle sue componenti, è possibile dedurre il significato del codice binario. 

L'origine del termine

Coniato da Philippe Dreyfus nel 1962, il significato di informatica può essere sintetizzato come segue: insieme dei varî aspetti scientifici e tecnici che sono specificamente applicati alla raccolta e al trattamento dell’informazione e in particolare all’elaborazione automatica dei dati, come supporto in svariati campi.

Ma questo insieme di parole, cosa vuol dire? 


Concentriamoci sul concetto che sta alla base dell’informatica: l’Informazione. L'informazione è l’oggetto della nostra investigazione e viene delegata a un calcolatore, su opportune indicazioni e istruzioni del programmatore.

IL CALCOLATORE E GLI ALGORITMI

Un calcolatore è un esecutore di algoritmi. Non entreremo nello specifico del calcolatore in questo corso, ma ci assicureremo di mettere da parte questi tre concetti prima di iniziare a lavorare sul codice binario: 

  • algoritmi, sequenze di istruzioni;

  • calcolatore, esecutore di algoritmi;

  • informazione, oggetto dell’investigazione. 

 

Algoritmi, calcolatore e informazione, o per meglio dire gestione dell’informazione, sono tre concetti di base fondamentali. Non a caso, un’ulteriore definizione di informatica viene data dall’Association for Computing Machinery menzionando proprio uno di questi elementi, in maniera molto pragmatica: l’informatica è lo studio degli algoritmi

Approfondiremo gli algoritmi nella prossima lezione.

Come operare con i calcolatori?

Fornire istruzioni ai nostri calcolatori ha una grande difficoltà: il calcolatore non parla la nostra lingua. Le istruzioni verbali che potremmo dare a un nostro compagno di classe per portare a termine un compito, non verrebbero comprese da una macchina. 

 

I calcolatori sono in grado di operare con informazioni binarie.

 

Un bit in informatica rappresenta un preciso stato fisico, di alta o bassa tensione nella cella di memoria del calcolatore. Da un punto di vista logico, l’informazione del bit può assumere alternativamente i valori {0,1}, unici simboli che possiamo utilizzare. 

Molto spesso, per ragioni di praticità, si tende a rappresentare sequenze di bit più lunghe. Un Byte è una sequenza di 8 bit ed esprime 2^8 numeri diversi, 256 numeri (ad esempio gli interi [0,255])

 

Altri multipli del bit:

  • Byte = 8 bit = 2^3 bit;

  • KiloByte (kB) = 10^3 Byte = 2^10 Byte;

  • MegaByte (MB) = 10^6 Byte = 2^20 Byte;

  • GigaByte (GB) = 10^9 Byte = 2^30 Byte;

  • TeraByte (TB) = 10^12 Byte = 2^40 Byte.

Capite dunque l’importanza di operare con la codifica binaria, cioè con la rappresentazione di un numero come una sequenza di 0 e di 1. Vediamo dunque alcune operazioni aritmetiche molto semplici.

Codifica in base 10 vs Codifica in base 2

La codifica in base 10 è una notazione posizionale, il che vuole dire attribuire un significato differente a seconda della posizione. Ad esempio, dato il numero 12547 in base 10, è immediato notare che:

    

      12547 = 1 × 10^4 + 2 × 10^3 + 5 × 10^2 + 4 × 10^1 + 7 × 10^0 = 10000 + 2000 + 500 + 40 + 7.

A questo punto, la domanda a cui dobbiamo rispondere è la seguente: quante possibili combinazioni di n elementi puoi creare se ogni elemento lo scegli tra due elementi diversi? 

 

Ogni bit può avere due valori, 0 oppure 1, quindi per ogni singolo bit ci sono due possibili combinazioni. Dato che ci sono n bit, per ottenere il numero totale di combinazioni possibili basterà moltiplicare il numero di combinazioni di ogni bit singolo. Quindi avremo che questo numero corrisponde a 2 * 2 * 2 * ..., con il fattore 2 che viene ripetuto n volte: il numero di combinazioni possibili con n bit è precisamente 2^n.

 

Detto questo, proviamo ad associare il numero di bit a uno specifico intervallo di rappresentabilità. Ricorda: il primo numero da rappresentare con qualsiasi numero di bit è sempre lo zero.

  • Con 1 bit: 2^1 numeri, intervallo [0, 2 - 1]

  • Con 2 bit: 2^2 numeri, intervallo [0, 2^2 - 1]

  • Con 4 bit:

  • Con 8 bit:

2^4 numeri; intervallo [0, 2^4 - 1]

2^8 numeri; intervallo [0, 2^8 - 1]

DALLA BASE 2 ALLA BASE 10

La generica definizione di un numero in notazione posizionale è questa:

N2 = an−1 × 2^n−1 + an−2 × 2^n−2 +  + a0 × 2^0.

 

Ad esempio, (101)2 si converte in base 10 in questo modo: 

(101)2 = 1 × 2^2 + 0 × 2^1 + 1 × 2^0 = 4 + 0 + 1 = (5)10.

Esercizi risolti

Converti i numeri da base 2 a base 10.

(11011)2 =

= 1 × 2^4 + 1 × 2^3 + 1 × 2^1 + 1 × 2^0 =

= 16 + 8 + 2 + 1 = (27)10

(1100010)2 =

= 1 × 2^6 + 1 × 2^5 + 1 × 2^1 =

= 64 + 32 + 2 = (98)10

(1000111)2 =

= 1 × 2^6 + 1 × 2^2 + 1 × 2^1 + 1 × 2^0 =

= 64 + 4 + 2 + 1 = (71)10

DALLA BASE 10 ALLA BASE 2

Metodo delle divisioni successive

  1. Parto dal numero in base 10 e divido per due (DIVISIONE INTERA);

  2. “Conservo” il resto della divisione intera;

  3. Procedo dividendo per due il risultato della divisione intera del passaggio precedente;

  4. Continuo così fino a quando il risultato della divisione non diventa 0

  5. Il mio numero in base 2 sarà la sequenza degli 1,0 di resto, al contrario, dall’ultimo al primo.

Esercizi risolti

Converti i numeri dalla base 10 alla base 2.

167 / 2 = 83 R1

83 / 2 = 41 R1

41 / 2 = 20 R1

20 / 2 = 10 R0

10 / 2 = 5 R0

5 / 2 = 2 R1

2 / 2 = 1 R0

1 / 2 = 0 R1

(167)10 = (10100111)2

531 / 2 = 265 R1

265 / 2 = 132 R1

132 / 2 = 66 R0

66 / 2 = 33 R0

33 / 2 = 16 R1

16 / 2 = 8 R0

8 / 2 = 4 R0

4 / 2 = 2 R0

2 / 2 = 1 R0

1 / 2 = 0 R1

(531)10 = (1000010011)2

 

LE OPERAZIONI CON

NUMERI NATURALI

Somma e differenza

Si ritorna alle elementari con i numeri in base 2: le somme si fanno in “colonna” ed esattamente come per i decimali

si considera il riporto.

  1. 0 + 0 = 0 riporto 0

  2. 1 + 0 = 1 riporto 0

  3. 0 + 1 = 1 riporto 0

  4. 1 + 1 = 0 riporto 1

Il bit di carry

Probabilmente ti ricordi che poco fa abbiamo menzionato gli intervalli di rappresentabilità.

 

Il fatto che un certo numero di bit possano codificare solo un determinato intervallo di numeri, implica che quando vado a sommare due numeri, debba prendere in considerazione l’eventualità che i bit utilizzati per codificare gli addendi, non siano sufficienti per codificare il risultato, ecco perché si avrà il cosiddetto bit di carry.

Esempio:

     1111 +

     1010 =

  (1)1001

Esercizi risolti

Svolgi le seguenti somme utilizzando correttamente il riporto e il bit di carry.

0 1 0 0 +

0 1 1 0 =

1 0 1 0

1 0 0 1 +

0 1 0 1 =

1 1 1 0

    1 1 0 1 +

    0 1 1 0 =

(1) 0 0 1 1

LE OPERAZIONI CON

NUMERI INTERI

Se volessimo utilizzare i nostri bit per esprimere un’informazione in più sul nostro numero, cioè il suo segno, come dovremmo fare?

Rappresentazione Modulo e Segno

È possibile dedicare il primo bit alla codifica del segno: se il valore del primo bit è

  • 1, il numero che segue è negativo;

  • 0, il numero che segue è positivo.

 

L’intervallo di rappresentabilità, in questo caso, si riduce di un’unità, poiché stiamo "sprecando" una codifica per lo zero, che potrà essere indicato come segue: 

    100000… oppure 000000… = +/- 0.

L’intervallo di rappresentabilità per n bit diventa dunque: 

− (2^n−1 − 1), 2^n−1 − 1.

 

Rappresentazione in Complemento a 2

Pensiamo di “allocare” diversamente lo spazio nel nostro intervallo di rappresentabilità.

Avendo a disposizione m bit, in CP2 si usano:

  • 2^(m−1) − 1 codifiche per valori positivi;

  • 1 codifica per lo zero;

  • 2^(m−1) codifiche per i valori negativi.

 

Si sceglie dunque di rappresentare un numero con m bit secondo il seguente criterio: 

  • se X è positivo o nullo, scrivo X in binario con m bit e la prima cifra sarà 0 come conseguenza dell’intervallo di rappresentabilità;

  • se X è negativo, scrivo 2^m − |X| in binario con m bit e la prima cifra sarà 1 come conseguenza dell’intervallo di rappresentabilità.

Anche qui il primo bit indica il segno, tuttavia INDICARE IL SEGNO È DIVERSO da ESSERE IL SEGNO. Cambiando semplicemente il primo bit, infatti, non otteniamo il numero opposto:

  • (45)10 = (0101101)CP2, ma cambiando di segno la prima cifra si ottiene

  • (1101101)CP2 = −(2^6) + 2^5 + 2^3 + 2^2 + 1 = −64 + 32 + 8 + 4 + 1 = (−19)10.

La somma in CP2 e l'overflow

Sommare in CP2 prevede gli stessi procedimenti usati per la somma binaria in colonna (vedi sopra). Risulta anche necessario individuare i casi in cui il numero risultante non è contenuto nell’intervallo di rappresentabilità e si verifica il cosiddetto overflow.

 

Al fine di evitare ciò dobbiamo verificare la consistenza del nostro risultato:

  • la somma di due addendi positivi deve essere un numero positivo;

  • la somma di due addendi negativi deve essere un numero negativo.

Dunque, se la somma di due numeri concordi ha segno discorde si è verificato overflow. Questa situazione, chiaramente, non può mai verificarsi se si sommano addendi di segno opposto.

Ricorda: in CP2 il bit di carry va sempre ignorato ai fini del risultato.

ESERCIZI GUIDATI

Conversione da CP2 a base 10

Per convertire un numero in CP2 a base 10 si effettua la conversione in modo totalmente analogo a quanto si farebbe per passare da base 2 a base 10, con l'unica differenza che, se il bit più significativo è un 1, viene sottratto anziché sommato a tutti gli altri.

Esempio:

      (101)CP2 = -1 × 2^2 + 0 × 2^1 + 1 × 2^0 = -4 + 1 = (-3)10

Ora prova tu!

  • (110)CP2

  • (010)CP2

(110)CP2 = -1 × 2^2 + 1 × 2^1 + 0 × 2^0 = -4 + 2 = (-2)10

(010)CP2 = 0 × 2^2 + 1 × 2^1 + 0 × 2^0 = (2)10

Conversione da base 10 a CP2

Il processo per convertire un numero X da base 10 a CP2 con m bit segue pochi semplici passi:

  1. si controlla che l'intervallo di rappresentabilità scelto (vedi sopra) sia sufficiente a rappresentare il numero;

  2. se è positivo, lo si scrive su m bit eventualmente aggiungendo degli zero a sinistra per raggiungere il numero di bit prestabilito;

  3. se X è negativo, si scrive innanzitutto |X| su m bit, poi si effettua il complemento di ogni bit (o → 1, 1 → 0) e infine si somma 1 al numero ottenuto.

Esempio: scrivere -56 in CP2 con il numero di bit necessari.

  1. m = 7 copre [-2^6, 2^6 - 1] = [-64, 63];

  2. converto il modulo in base 2: (56)10 = (0111000)2;

  3. effettuo il complemento: 0111000 → 1000111;

  4. sommo 1: 1000111 + 1 = (1001000)CP2 = (-56)10.

Esercizio: scrivi -48 in CP2 con il numero di bit necessari.

  1.  

  2.  

  3.  

  4.  

7 bit, che coprono [-2^6, 2^6 - 1] = [-64, 63]

(48)10 = (0110000)2

0110000 → 1001111

1001111 + 1 = (1010000)CP2 = (-48)10

CONCLUSIONE

Complimenti, hai completato la prima lezione!

In questa lezione hai imparato cos'è l'informatica e hai preso confidenza con i concetti di base del codice binario. Adesso puoi tuffarti nel mondo degli algoritmi e della programmazione!

Usa i pulsanti qui sotto per avanzare alla prossima lezione o per tornare alla home del corso.