Ogni buon programmatore dovrebbe conoscere almeno 2 sistemi di numerazione oltre
quello decimale imparato alle scuole elementari: il sistema BINARIO e quello
ESADECIMALE.
Il sistema di numerazione binario è particolarmente legato ai calcolatori in
quanto essi possono riconoscere solo segnali aventi due valori : uno alto e
uno basso ; per cui si associa al valore alto la cifra binaria 1 e a quello
basso la cifra binaria 0 (oppure H e L, o ancora VERO e FALSO).
Infatti nel sistema binario esistono solo due cifre 0 e 1 appunto e i numeri
ma anche tutte le altre informazioni vengono rappresentate con sequenze di Zero
e di Uno.
Il sistema di numerazione binario è un sistema posizionale come quello decimale,
cosa vuol dire: consideriamoli numero decimale 237 , esso può essere scomposto
in questo modo:
237 = 2 * 10^2 + 3 * 10^1 + 7 * 10^0
ossia le cifre del numero vengono moltiplicate per le potenze di dieci (da cui
decimale) crescenti da destra verso sinistra. I numeri binari vengono costruiti
nello stesso modo solo che invece di potenze di 10 si usano le potenze di 2,
quindi considerando il seguente numero binario, scomponendolo ed effettuando
i calcoli si ottiene il corrispondente numero decimale :
11010010 = 1*2^8 + 1*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0
= 210
Ora che abbiamo visto la conversione Base 10 -> Base 2 vediamo come si effettua
l'operazione inversa.
L'algoritmo è abbastanza semplice :
1 - Si divide la cifra decimale per 2
2 - Se il quoziente è pari si scrive 0 se è dispari 1
3 - Si divide il quoziente ancora per 2 e si ripete il passo 3
4 - La sequenza ottenuta RIBALTATA è la rappresentazione binaria del numero
decimale
Vediamolo applicato al numero decimale 145 (questo è lo schema che di solito
si utilizza):
145 | 72 | 1 ( cifra - significativa ) 36 | 0 18 | 0 9 | 0 4 | 1 2 | 0 1 | 0 0 | 1 (cifra + significativa )Quindi 145 in base 10 equivale a 10010001 in base 2. Semplice vero ??
DEC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F
Hex Bin 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 A 1010 B 1011 C 1100 D 1101 E 1110 F 1111
001111110101 3 F 5Per il viceversa basta. prendere il numero binario a blocchi di 4 cifre (partendo dalla cifra meno significativa) e convertirli in cifre esadecimali:
0010 --> 2 0101 --> 5 1101 --> D 0101 --> 5 10 --> 2Quindi corrisponderà al numero 25D52 esadecimale !!
1 - Si complementano tutti i bit (0-->1 e 1-->0) 00000101 |||||||| 11111010 2 - al numero ottenuto si somma 1 11111010 + 1 ---------- 11111011 3 - Il numero ottenuto è la rappresentazione binaria di -5Per fare la verifica provate a sommare 5 a -5 e vedrete che otterrete 0
Decimale 0 1 2 3 4 5 6 7 8 9 BCD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
L'Assembly non è un linguaggio tipizzato, nel
senso che non esiste il tipo int, float, ecc... sta al programmatore trattare
i numeri in modo diverso a seconda di cosa essi rappresentano nel momento in
cui li usa.
In binario vengono rappresentati anche i caratteri. Per ogni carattere si usano
8 bit, per un totale di 255 caratteri, per le corrispondenze carattere-codice
si fa riferimento alla convenzione ASCII. Tutti abbiamo da qualche parte una
tabella dei codici ASCII.
Oltre a saper rappresentare i numeri binari bisogna saper fare anche le operazioni
con essi, spendero' solo poche parole ma una volta capito il meccanismo di base
riuscirete benissimo a risolvere complesse operazioni !!!.
Per capire come si effettua una somma basta pensare a cosa avviene con i numeri
in base 10 e ricordarsi che in base 2 ci sono solo due cifre.
Quindi (in base 10) se sommo 7 a 6 scrivo 3 con il riporto di 1, sommo il riporto
a 0 e unendo i risultati ottengo (magia) 13.
In decimale il riporto si ha quando la somma supera 10 in binario quando la
somma supera 2, quindi ad esempio :
10100011 + 10100101 ---------- 101001000Provate a fare qualche esempio vedrete che è facilissimo, l'importante è aver capito il meccanismo che sta alla base (se proprio non lo capite andate a rileggervi i quaderni delle elementari !!!!)
AND X Y | Z 0 0 | 0 0 1 | 0 Z = X and Y 1 0 | 0 1 1 | 1 OR X Y | Z 0 0 | 0 0 1 | 1 Z = X or Y 1 0 | 1 1 1 | 1 XOR X Y | Z 0 0 | 0 0 1 | 1 Z = X xor Y ( or esclusivo ) 1 0 | 1 1 1 | 0 NOT X | Z 0 | 1 Z= not X ( il NOT a differenza degli altri è un 1 | 0 operatore unario: opera su una sola variabile)Questo è quello che si chiama condensato di logica però è tutto quello che ci serve sapere sulle operazioni, se volete approfondire il concetto contattatemi e sarò lieto di darvi altre informazioni su questo campo della matematica 8-)