La codifica binaria

Extra & Approfondimenti su C e C++.
Avatar utente
Mario
Esperto
Esperto
Messaggi: 144

La codifica binaria

Messaggio#1 » 12/04/2015, 19:53

LA CODIFICA BINARIA

Come sappiamo, la memoria RAM può essere rappresentata come una tabella suddivisa in righe e colonne. Ogni riga viene divisa in quattro blocchi formati da una sequenza di otto bit (cifra binaria - binary digit possono assumere come valore solo 0 o 1). Possiamo quindi considerare questi quattro blocchi come quattro byte.

Esistono vari tipi di sistemi di numerazione, ricordiamo tra i più importanti : in base 2 (binario) , in base 8 (ottale), in base 10 (decimale), in base 16 (esadecimale). Il sistema esadecimale è particolare poiché dopo aver utilizzato i numeri da 1 a 9, vengono utilizzate le lettere A, B, C, D, E, F . Dato un numero, esistono vari modi per cambiare la sua base; in questa guida ne indicherò i più importanti:
- Dato un numero in base 2, per trasformarlo in base 10, è necessario moltiplicare ogni cifra per il suo rispettivo peso e sommare tutti i risultati.

Esempio:

Il numero 101 ( in base 2) = 1(2)2 + 0(2)1 +1(2)0 = 5 (in base 10)

-Dato un numero in base 10, per trasformarlo in base 2, è necessario dividerlo per due la cifra fino a raggiungere quoziente zero. Ora, ottenuto il risultato e letto dal basso verso l'alto, si avrà la parte intera del nostro numero (in base 2) .

Esempio

Utilizziamo il numero 30.
30:2 = 15 , resto 0
15:2 = 7 , resto 1
7:2 = 3 , resto 1
3:2 = 1 , resto 1
1:2 = 0 , resto 1
Il numero ottenuto è 11110 ( in base 2) ed equivale al numero 30 ( in base 10)

Attenzione : poniamo il resto dell'ultima divisione uguale a zero poichè non possiamo andare oltre.

-Data la parte decimale di un numero in base 10, per trasformarlo in base 2, è necessario moltiplicare per due la parte decimale finchè non si arriverà ad una forma del tipo 1,0000...0. Il numero in base 2 risulterà formato dalla cifra che precede la virgola dopo ogni moltiplicazione.

Esempio

Utilizziamo la parte decimale 0,125.
0,125 x 2 = 0,25 , consideriamo lo 0
0,25 x 2 = 0,50 , consideriamo lo 0
0,50 x 2 = 1 , consideriamo l'1
Il numero ottenuto è 001 , quindi il numero binario sarà del tipo : (parte intera).001

Attenzione : alcuni numeri non permettono di arrivare ad una fine come si è riscontrato nel 0,125 . Infatti potreste trovare situazioni in cui il numero risulta infinito.

Avendo 8 bit a disposizione, il range massimo di combinazioni ottenibili va da 0 a 2n -1 ,dove n è il numero di bit a disposizione (nel nostro caso 8), quindi da 0 a 255.

Attenzione : Essendo ora già più esperti con i numeri in forma binaria, iniziamo a visualizzarli con la seguente forma

0000 0001 = 1 ( utilizziamo sempre le 8 cifre a disposizione)

Complemento a uno / Complemento a due

Come facciamo a rappresentare i numeri negativi ? Facile utilizziamo il complemento a uno. Queste tecnica è molto immediata e quasi banale, infatti invertendo il valore delle cifre di un numero binario , si può ottenere il suo opposto ( valore negativo) .

Esempio

Prendiamo il numero 10, ovvero in binario : 0000 1010.
Invertiamo le cifre e otteniamo : 1111 0101.
Il risultato ottenuto , risulterà essere il numero -10 ( in base 10)

Col passare del tempo si è deciso di trascurare questa tecnica e di utilizzare il complemento a due. Prima di illustravi la dinamica, è necessario sapere che per convenzione da ora in poi si utilizza un bit per il segno, ovvero 1 ( negativo ) e 0 ( positivo ). Il complemento a due permette quindi di calcolare l'opposto del numero preso in considerazione.

Esempio

Prendiamo il numero 5, ovvero in binario : 0000 0101 .
Ora con la tecnica del complemento a uno invertiamo i bit : 1111 1010 .
Ora sommiamo alla cifra ottenuta 1 , 1111 1010 + 0000 0001 = 1111 1011.
Il numero ottenuto è il numero -5 ( in base 10 ) .

Attenzione : in questo modo, notiamo che l'opposto dello zero è sempre zero, cosa che non accadeva con il complemento a uno. In questo modo inoltre, nelle addizioni l'overflow viene ignorato.

Standard IEEE754

Con l'avanzare della tecnologia, si ha l'esigenza di uno standard che possa adeguarsi alle esigenze di tutti ... lo standard IEEE754. Lo standard IEEE per il calcolo in virgola mobile (IEEE 754) permette la rappresentazione dei numeri in virgola mobile. Di questo standard esistono due versioni: precisione singola (32 bit) e precisione doppia (64 bit) . Secondo questo standard, un numero deve essere diviso e rappresentato in tre parti distinte :

- Il segno , a cui riserviamo un bit e indichiamo con la lettera s;
- l'esponente , indicato con la lettera e;
- la mantissa , indicata con la lettera m;

Nella versione a 32 bit, come da nome, riserviamo alla rappresentazione del numero 32 bit ovvero 1 bit per il segno, 8 bit per l'esponente e 23 bit per la mantissa. Il valore del numero rappresentato è (-1)s x 2E x M . Il campo s specifica il segno del numero: 0 per i numeri positivi, 1 per i numeri negativi. Il campo e contiene l'esponente del numero in forma intera. Essendo costituito da 8 bit, permette di rappresentare 256 valori. I valori 0 e 255 vengono riservati per funzioni speciali (descritte in seguito); gli altri permettono di rappresentare 254 valori per i numeri in forma normale, compresi tra -126 e 127, dato che questo campo deve poter rappresentare sia numeri enormi che minimi; tuttavia, adoperando il metodo usato per la rappresentazione del segno dei numeri interi, si creerebbero problemi per il confronto tra numeri. Per risolvere questo problema, il campo è rappresentato in eccesso k detto bias, per cui:

e = E + k
E = e - k

Per il numeri a precisione singola, il bias è uguale a 127 . Questa tecnica viene chiama polarizzazione e consiste nel sottrarre e aggiungere 127 al nostro esponente per ottenere il numero in forma binaria compreso tra 1 e 254.

Esempio

Prendiamo il numero −118.5 e utilizziamo lo standard IEEE754.
Segno = 1 poichè è negativo
Ora trasformiamo il numero in binario e convertiamolo in esponenziale: 1110110,1 = 1,1101101 x 26
La mantissa risulta la parte a destra della vergola , ed essendo di 23 bit è necessaria riempirla con zeri se necessario
m= 11011010000000000000000
Ora prendiamo l'esponente 6 e lo sommiamo al bias ovvero 127 e diventa 133, in binario 10000101

Il Numero ottenuto sarà quindi : 1|10000101|11011010000000000000000

Per il metodo a precisione doppia, è necessario cambiare solo qualche elemento ma la tecnica è identica:

-Bit riservati all'esponente = 11
-Bit riservati alla mantissa = 52
-Il bias = 1023

:thanks:
Se la guida è stata di tuo gradimento, aiutaci a migliorare con un click premendo sull'immagine sottostante e votandoci! :D
Immagine


Torna a “Extra C/C++”