I sistemi di numerazione

Ci sono 10 tipi di persone: quelli che capiscono la numerazione binaria e quelli che non la capiscono

Per dissuadere i pochi ostinati che sono arrivati a leggere fin qui, voglio parlarti dei sistemi di numerazione.

Secondo antiche leggende, la razza umana sarebbe il frutto di un esperimento di ingegneria genetica operato da alieni esadattili arrivati sulla Terra trecentomila anni prima di Cristo. Che sia vero o no, immagina di avere intorno a un tavolo uno di questi alieni, uno dei tuoi confratelli e un uomo che abbia solo un dito. Se poggiassi una dozzina di uova sul tavolo e chiedessi a ciascuno di loro di numerarle, cosa otterresti? Il tuo amico, che conta in base alle dieci dita delle sue mani, direbbe che le uova sono pari a una volta tutte le sue dita più due. Se esprimessimo questa risposta con potenze del numero delle dita delle mani del tuo confratello, otterremmo che:

1x101 + 2x100 = 12

L'alieno, abituato a contare in base alle sue dodici dita, direbbe che le uova sono:

1x121 + 0x120 = 10

Il disgraziato con un dito, che può considerare solo le due possibilità: un dito/nessun dito, sarebbe costretto a fare un calcolo più lungo:

1x23 + 1x22 + 1x21 + 0x20 = 1100

Questi tre risultati, per quanto differenti, non sono sbagliati, perché ciascuno dei tre conta le dodici uova in base al numero delle proprie dita e risponde di conseguenza. Le uova rimangono le stesse: cambia solo il sistema di numerazione.
Del resto, è naturale che sia così: i numeri sono solo concetti astratti; simboli che si utilizzano per identificare delle quantità. Potresti sostituire i numeri da 0 a 9 con le prime dieci lettere dell'alfabeto e non cambierebbe nulla:

0123456789
abcdefghil
a + b = b     
b + c = d   
d * e = bc

Il metodo di calcolo resta lo stesso: quando la quantità da valutare è maggiore del numero delle cifre disponibili, si riporta la differenza a sinistra, nella colonna di ordine superiore. Il valore bc della moltiplicazione, significa infatti:

b*(numero di cifre)1 + 
c*(numero di cifre)0

ovvero, visto che il numero di cifre a nostra disposizione è 10:

b*10 + c*1

Se sostituiamo le lettere con i numeri, otteniamo:

1*10 + 2*1 = 3*4

La numerazione esadecimale fa proprio questo: utilizza le lettere dalla A alla F in aggiunta ai dieci valori della numerazione araba:

0123 4567 89AB CDEF

Questo torna molto utile quando hai a che fare con dei byte di otto cifre, come vedremo dopo.


Nei sistemi di numerazione posizionali il valore di una cifra dipende dal punto in cui si trova: le cifre a sinistra hanno più valore delle cifre a destra, ma non tutti i sistemi di numerazione funzionano allo stesso modo. Se tu chiedessi a un antico romano di calcolare il numero delle uova, ti risponderebbe:

XII

Anche questo sarebbe un risultato corretto, pur se diverso dai precedenti. Il sistema di numerazione romano è un po' più complicato dei sistemi in base 10, 12 e 2 che abbiamo visto finora. Nella numerazione romana, il valore di una cifra (I, V, X, L, C, D, M) non dipende dalla sua posizione assoluta, ma dalla sua posizione in rapporto alle altre cifre.
Il Maestro Canaro nacque il 29 febbraio 1964; in cifre romane, questa data è:

XXIX II MCMLXIV

ovvero:

10+10+(10-1)
1+1
1000+(1000-100)+50+10+(5-1)

I numeri romani possono andar bene per un popolo di conquistatori: sono facili da scolpire nel marmo, a memoria di una battaglia vittoriosa e non considerano lo zero, la nullità, ma per il commercio e per i calcoli in generale sono piuttosto scomodi. Quando gli arabi diffusero nel bacino del Mediterraneo il sistema di numerazione che avevano a loro volta imparato dagli indiani, la sua diffusione fu tanto rapida quanto inevitabile.
I computer, però, non sono né egocentrici come un imperatore romano, né astuti come un mercante fenicio; al contrario, sono veloci, ma tonti: bisogna spiegar loro le cose in maniera semplice, perché le possano portare a termine.
La numerazione romana non fa per loro, perché richiede troppi simboli e troppe regole per essere messa in pratica. La numerazione decimale è già un po' meglio, ma richiede comunque la definizione di dieci simboli diversi, uno per ciascuna cifra da 0 a 9. Paradossalmente, il sistema di calcolo che un calcolatore può capire più facilmente è quello per noi più complicato, ovvero il sistema binario. Questo sistema richiede solo la definizione di due simboli: 1 e 0; due concetti che possono capire facilmente sia un transistor che una scheda perforata.


Qualcuno potrebbe dirti che ci sono sistemi di calcolo migliori del binario. Qualcuno, probabilmente uno di quei disgraziati individui che amministrano le basi di dati, potrebbe dirti che il sistema ternario bilanciato funziona molto meglio e semplifica i calcoli. Ciò corrisponde al vero.
La ragione per cui il Maestro Canaro non approvava i sistemi ternarii era filosofica, non tecnica. I due valori del sistema binario possono essere identificati con i valori logici sì/no, vero/falso; ovvero con le due condizioni di esistenza e non esistenza, per esempio, di un buco in una scheda perforata o di una corrente in un circuito. Al contrario, i sistemi con basi superiori a due, richiedono la definizione di un terzo stato che non può essere né sì, né no; né vero, né falso; né esistente, né in-esistente. Questo terzo stato intermedio può essere definito solo per mezzo di una valutazione che non è logica, ma quantitativa. Mettiamo che su una scheda perforata il valore 0 sia associato all'assenza di fori e il valore 1 sia associato alla presenza di un foro; un terzo valore, differente da 0 e da 1, potrebbe essere identificato o da un foro di dimensioni differenti o da una concavità. Quale che sia la soluzione scelta, saremmo costretti a definire un valore in base a una grandezza fisica, ovvero, a basare il calcolo digitale su una misurazione analogica.
Il Maestro Canaro pensava che ciò fosse empio.


Un esempio di tutto ciò di cui ti ho parlato oggi lo trovi nella codifica RGB dei colori delle pagine Web. Nella codifica RGB, ciascun colore è definito come una combinazione di rosso verde e blu – i colori Red, Green e Blue le cui iniziali costituiscono l’acronimo del sistema.
La quantità di ciascun colore è determinata da un valore di 8 bit e può quindi variare da 0 a 255 (28).
I possibili colori della codifica RGB possono essere calcolati o moltiplicando fra loro i tre valori di R, G e B:

256 * 256 * 256 = 16.777.216

oppure considerando i tre byte un unico valore binario di 24 cifre:

224 = 16.777.216

Un colore RGB con tutti e tre i suoi byte a zero è nero; uno con tutti i byte di valore 255 è bianco.

RGB(0,0,0)
RGB(255,255,255)

Fra questi due estremi ci sono le restanti 16.777.214 possibili combinazioni dei tre valori. Se assegnamo un valore solo a uno dei tre byte, otterremo delle gradazioni di rosso, verde o blu:

RGB(234,0,0)
RGB(0,111,0)
RGB(0,0,80)

Se attribuiamo dei valori a tutti e tre i byte, otterremo dei colori composti. Per esempio, il colore di sfondo dei brani di codice del tuo libro o il colore dei link di navigazione:

RGB(232,232,222)
RGB(85,85,0)

Gli stessi valori possono essere espressi in notazione esadecimale:

000000
FFFFFF
ea0000
006f00
000050
e8e8de
555500

L’unica differenza è che la numerazione esadecimale è più facile da utilizzare e da memorizzare, perché ciascuna lettera corrisponde a un byte. Il valore binario e il colore visualizzato, rimangono gli stessi, indipendentemente dal modo in cui tu li vuoi misurare.


C’è qualcosa, in tutto questo, sulla quale vorrei che tu soffermassi la tua attenzione: i numeri descrivono un valore, non sono un valore. I valori esistevano da prima che esistessero i numeri e gli sopravviveranno. La quantità di fiammiferi che vedi qui sul mio tavolo, rimane la stessa sia che tu la chiami 4, 100 o IV, così come rimarrebbe la stessa se tu la chiamassi five o cinco.
I numeri li abbiamo inventati noi, i valori, no.