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: consideriamo il 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^7 + 1*2^6 + 0*2^5 + 1*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 è intero si scrive 0 se non è intero 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 5
Per 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 --> 2
Quindi 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 -5
Per 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 256 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-1=9 in binario quando la
somma supera 2-1=1, quindi ad esempio :
10100011 +
10100101
----------
101001000
Provate a fare qualche esempio vedrete che è facilissimo, l'importante è aver
capito il meccanismo che sta alla base che è analogo a quello che si usa in decimale.
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-)| Assembly Page di Antonio |
|