Sistemi di numerazione (binario, decimale, esadecimale)
 
Salve a tutti sono sempre Quequero, in questo articolo parleremo dei vari sistemi di numerazione che sono molto utilizzati nei linguaggi di programmazione e ci serviranno per comprendere molte cose.
Inizierò col parlare del sistema decimale che tutti conosciamo e che utilizziamo ogni dì.
Questo sistema viene detto "decimale" perchè utilizza le potenza di...dieci, per farvi capire cosa intendo ecco un esempio alquanto banale, proviamo a scomporre il numero 1258:
1258 = 1x10^3 + 2x10^2 + 5x10^1 + 8x10^0
Per verificare se abbiamo fatto bene la scomposizione proviamo a moltplicare ogni valore per la sua potenza di 10 e poi lo sommiamo agli altri:
               1x10^3 =   1000    +
2x10^2 =    200    +
5x10^1 =     50     +
8x10^0 =      8     =
               --------------------
              1258
sembra che il risultato sia esatto, ciò vuol dire che siamo stati bravi ;))
Bene bene, questo è stato solo un ripasso per introdurre il sistema di numerazione binario, cioè quello usato dai nostri processori e comunque anche da qualunque componente elettronico, (calcolatrici, orologi digitali, radio, gps, modem, stereo ecc...) spero che vi siate chiesti almeno una volta come fa il computer ad aprire una finestra oppure una calcolatrice ad eseguire un calcolo "2-1", ebbene tutti i processori riescono a capire la differenza tra due stati di tensione cioè: 0 (potenziale basso) e 1 (potenziale alto), ecco l'importanza di questo sistema, ma come possiamo convertire un numero binario in decimale?
Dal momento che conosciamo tutti i numeri binari (1 e 0 :) creiamo un numerino e convertiamolo, prendiamo per esempio questo:
    
11001011 = 1x2^7 + 1x2^6 + 0x2^5 + 0x2^4 + 1x2^3 + 0x2^2 + 1x2^1+ 1x2^0
1x2^7 =   128    +   \
1x2^6 =    64    +    \
0x2^5 =     0    +     |
0x2^4 =     0    +     ---- numeri binari convertiti in 
1x2^3 =     8    +     |     decimali e sommati tra loro
0x2^2 =     0    +     |
1x2^1 =     2    +    /
1x2^0 =     1    =   /
       ----------
  203
 
Il risultato 203 è esatto? Verifichiamolo.....ma come possiamo farlo se finora abbiamo imparato solo a scomporre un numero in potenze di dieci e a convertire un binario in decimale?
Bhè semplice dovete riaprire i libri di matematica, ma non vi preoccupate perchè Quequero lo farà per voi ;))
Ecco come si fà:

               -----------------
         ¦ Numero decimale ¦
               -----------------
                      ¦¦
                      ¦¦ Dividiamo per 2   <---¦
                      ¦¦                                  ¦
             ---------------------- ---               ¦
            ¦ Il quoziente è pari? ¦            ¦
             -------------------------                 ¦
                      ¦¦                                  ¦
                      ¦¦                                  ¦
               SI     /  \  NO                          ¦
                    /     \                                ¦
             -------       -------                       ¦
            /                     \                        ¦
      -------------          -------------             ¦
     Scriviamo 0 ¦ ¦ Scriviamo 1 ¦         ¦
      -------------          -------------             ¦
            \                        /                    ¦
             \------------------/                     ¦
                      ¦¦                                ¦
                      ¦¦                                ¦
             ---------------------                    ¦
        ¦ Il numero è finito? ¦                ¦
             ---------------------                    ¦
                      ¦¦                                ¦
                      ¦¦                                ¦
               SI     /  \  NO                         ¦
                    /     \                               ¦
             -------       -------                      ¦
            /                      \                      ¦
    -------------------          ----------           ¦
¦ Prendi tutte le   ¦  ¦ Continua ¦  -----
¦ cifre e ribaltale ¦     ----------
    -------------------
Bello il logaritmo vero? Spero di si, proviamo a vedere se 203 corrisponde realmente a 11001011, per farlo usiamo la colonnina che tanto odiavamo alle elementari:
203|
101|1
51|1
25|0
12|1
  6|0
  3|0
  1|1
  0|1
dall'alto al basso vediamo questi numeri 11010011 ma, come vi dicevo, dobbiamo ribaltarli così avremo 11001011....esatto i numeri corrispondono!!!!
Ovviamente non andrete mai a convertire i numri a manualmente visto che anche la calcolatrice di winzoz lo fa (dovete selezionare visualizza|scientifica) comunque un po' di cultura non guasta mai ;)))
facciamo il resoconto di ciò che abbiamo appreso finora:
Scomposizione di un numero decimale e conversione da: Binario--->Decimale--->Binario
Affrontiamo ora il tipo di numerazione più importante cioè quello esadecimale, (o base 16) questo tipo di numerazione differisce dalla decimale perchè ci sono 16 numeri invece che i soliti 0 1 2 3 4 5 6 7 8 9
e dalla binaria perchè ogni numero in base 16 equivale a 4 in base 2, siccome avrete le idee confuse ecco una tabella riassuntiva (la metto in verticale altrimenti non entra nel mio monitor da 14'')
Decimale        Binario Esadecimale
             
   0          0000               0
           1                      0001       1
           2                      0010       2
           3                      0011       3
           4                      0100       4
           5                      0101       5
           6                      0110       6
           7                      0111       7
           8                      1000       8
           9                      1001       9
          10                      1010       A
          11                      1011       B
          12                      1100       C
          13                      1101       D
          14                      1110       E
          15                      1111        F    
 
Come facciamo a convertire un numero binario in esadecimale e viceversa? In base 16 le conversioni sono semplicissime dal momento che ogni numero esadecimale equivale a 4 binari quindi supponiamo di avere 8F5DA come fà a diventare binario? Eccovi un altro esempio:
     8 = 1000
     F = 1111
     5 = 0101
     D = 1101
     A = 1010
Possiamo dire che 8F5DA = 10001111010111011010.
Vogliamo fare la solita verifica per vedere se abbiamo fatto tutti i calcoli bene? Credo di si, la domanda sorge ormai spontanea...come si fà? Si divide il numero binario in gruppi di 4 cifre (a partire dalla meno significativa che è l'ultima, la più significativa è la prima) e se vede man mano a cosa corrisponde:                              1010 1101 0101 1111 1000
   A     D     5        F       8
facciamo un po' di "reversing" sul numero ottenuto ed otteniamo come sospettato 8F5DA.
Questo tipo di conversione "veloce" vale solo per il sistema Base2->Base16->Base2
Per fare i calcoli da Base16 a Base10 e vice versa le operazioni sono le stesse che abbiamo usato durante le conversioni Base2->Base10->Base2, ovviamente i sistemi di numerazione sono infiniti, un sistema caduto ormai nell'oblio è stato quello in Base8 (ottale) ma possiamo convertire qualunque cosa in quelunque base, pensate che qualche settimana fà ho fatto un CrackMe che calcolava il seriale da inserire in base 78, in numerazioni di questo genere ci sono sicuramente tutte le lettere dell'alfabeto e vengono usati anche simboletti sconosciuti alla razza umana, una cosa bella di questi sistemi è che un numero come 1000000000000000000000000000000000000000 diventa cortissimo e magari simile a questo: ~1«½¦©     ;))))
Prima di concludere anche questo articolo vorrei dirvi che non ho parlato volutamente della rappresentazione dei numeri negativi in base2 visto che utilizzano un particolare metodo detto "complemento a 2" estremamente difficile, se mi verrà chiesto scriverò un articolo anche su questo ma vi assicuro che verrebbe estremamente lungo, ma lungo lungo lungo ;)))
Ora voi vi starete chiedendo "Ma che cazz ce ne frega di conoscere come contano i calcolatori", in realtà l'argomento è importante dal momento che un compilatore un linguaggio ad alto livello (quale può essere il c/c++ o il Pascal ecc...) una volta compilato non fà altro che convertire tutto in Assembly che a sua volta converte tutto in esadecimale e che il processore converte in linguaggio macchina cioè 10110101011 in codice binario.
Ultima raccomandazione: se incontrate qualcosa del tipo 1512h e non sapete cosa cavolo sia (base8, 18 o 48) dovrete guardare in fondo, vedete quell'h? Quella indica che il numero si trova in base 16, eccovi l'ultima tabella:
b = Binario
o = Ottale
d = Decimale
h = Esadecimale
quindi se smanettate con l'Assembly e dovete andare all'offset 00018F5Ah non domandatevi "come kazz si fà ad avere un offset a 9 cifre" ma ricordate che l'ultima lettera minuscola vi indica sempre la base.
Ora che siete dei matematici divertitevi (io odio la matematica) ;)))))
Ciauzzzzzzzz Quequero
http://quequero.cjb.net
e-mail: [email protected]