Che esagono?

Dovrò approfondire la scienza.

C'è una scena all'inizio del Marziano (2015) in cui il personaggio di Matt Damon Mark Watney, presunto morto dai suoi compagni di squadra e bloccato sul pianeta rosso dopo una bizzarra tempesta, rianima la defunta sonda Pathfinder per comunicare con la NASA. Mentre la sonda è in grado di inviare le immagini sulla Terra, la migliore NASA che può fare con la sonda da remoto è cambiare la posizione della sua videocamera integrata.

Watney si rende conto che i 360 gradi di rotazione della telecamera consentirebbero al team della NASA di spiegargli i messaggi lettera per lettera se fosse in grado di fornire loro un alfabeto per puntare la telecamera della sonda. Tale soluzione presenta tuttavia un altro problema. L'alfabeto latino ha 26 caratteri in inglese, il che significa che dovranno essere abbastanza vicini tra loro in un cerchio attorno alla sonda ed è molto probabile che avrà difficoltà a discernere quale lettera deve indicare la sonda.

"Non può essere il nostro alfabeto. 26 caratteri più una carta domanda in 360 ci dà 13 gradi di arco. È troppo stretto. Non saprei mai a cosa punta la fotocamera ... esadecimali in soccorso ".

Quindi invece Watney risolve il problema utilizzando esadecimali e una tabella ASCII per decifrare i messaggi in codice dalla NASA, e prima che tu lo sappia è in grado di parlare con la Terra in più di semplici domande sì / no.

Tirare crediti

…aspetta cosa?

Sai che stai facendo matematica complessa quando inizi a usare le lettere.

Ammetterò di capire a malapena ciò che è emerso in questa scena la prima volta che ho visto il film. In un film con alcuni concetti scientifici piuttosto avanzati, questa scena mi è venuta in mente perché mi è sembrata un'idea piuttosto semplice che mi è comunque passata per la testa. Apparentemente il regista Ridley Scott ha avuto difficoltà a descrivere questa scena perché non ha compreso appieno il concetto da solo.

Sto imparando la programmazione in questo momento e ho capito che anche se linguaggi di livello superiore come Ruby o Javascript possono essere difficili da padroneggiare, sono ancora abbastanza lontani dal codice macchina di base che alimenta i computer basati esclusivamente su 1 e 0 . Quel basso livello di programmazione mi ha sempre intimidito, ed è stata probabilmente la ragione principale per cui avevo poco interesse per l'informatica come campo di carriera mezza vita fa, prima che la programmazione diventasse una professione più accessibile. Ma da quando ho iniziato il percorso per diventare uno sviluppatore 6 settimane fa, ho imparato che puoi scomporre qualsiasi azione / concetto complesso in una dimensione gestibile se lo fai solo passo per pezzo.

Quindi cominciamo con la parola esadecimale. È derivato dall'esagono greco che significa 6 e decimale, che deriva dal decimo latino, che significa decimo. Gli esadecimali sono un sistema numerico che utilizza 16 come base, anziché 10 come nel caso dei decimali "normali".

Ora, se dovessi spiegare un sistema di numeri base10 a qualcuno che non aveva mai fatto l'aritmetica prima, dovresti prima spiegare perché era vantaggioso persino utilizzare un sistema numerico. Dopotutto, potremmo anche usare una semplice barra ("\") per indicare la quantità di oggetti. Ad esempio, un pesce potrebbe essere rappresentato come \ pesce, due pesci come \\ pesce, tre pesci come \\\ pesce e così via. In teoria, potresti rappresentare qualsiasi quantità di pesce usando un solo personaggio. In pratica, tuttavia, questo diventa ingestibile una volta che si entra in grandi quantità di pesce. Anche una cinquantina di pesci si trasforma in uno squarcio di corde illegalmente lungo.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ pesce
I pesci non hanno la durata della memoria a breve termine per concepire così tanti, e nemmeno tu.

Utilizzando un sistema decimale base10, possiamo rappresentare molto facilmente una quantità di pesce 1.000 volte maggiore delle suddette barre utilizzando un decimo del numero di \ 's. Dovremo usare alcuni simboli in più rispetto a una semplice barra, ma ne vale la pena il compromesso in termini di efficienza. In effetti, è così efficiente che avremmo bisogno solo di una combinazione di due di questi simboli per rappresentare quei 50 pesci sopra.

Le cifre nel sistema base10 sono:

0 1 2 3 4 5 6 7 8 9

dove

0 =
1 = \
2 = \\
3 = \\\
4 = \\\\
5 = \\\\\
6 = \\\\\ \
7 = \\\\\ \\
8 = \\\\\ \\\
9 = \\\\\ \\\\

Quindi \\\\ pesce potrebbe invece essere scritto come 4 pesci, occupando una frazione dello spazio. Una volta raggiunta una quantità maggiore di 9, dobbiamo ricominciare da 1 e aggiungere una cifra segnaposto, 0.

10 = \\\\\ \\\\\

Ora, per rappresentare una quantità maggiore di 10, come 4 maggiore di 10, combiniamo semplicemente le cifre 10 e 4 per fare 14

10 = \\\\\ \\\\\
4 = \\\\
14 = \\\\\ \\\\\ \\\\

Una volta raggiunti di nuovo 9, ripetiamo e aumentiamo la prima cifra di una.

...
17
18
19
20
21
...

Possiamo seguire questo schema fino a 99, in cui possiamo ricominciare il modello con 10 e un ulteriore 0: 100. Quindi in un sistema decimale basato su 10 ogni 0 aggiuntivo aggiunto a destra rende il numero 10 volte maggiore rispetto al precedente.

10 * 1 = 10
10 * 10 = 100
10 * 100 = 1000
10 * 1000 = 10000
...

Quindi perché base16?

Ovviamente un sistema che utilizza dieci cifre ha molto senso se ne hai usata una per tutta la vita, ed è molto intuitivo dato che siamo tutti nati con due serie di cinque dita su cui contare (la parola digitus in latino significa "dito", dopo tutto), e quindi siamo abituati a considerare multipli di dieci in gruppi di cinque.

Quando si tratta di dati archiviati su computer, i multipli di 5 non sono altrettanto utili. Fondamentalmente, un circuito di computer può esistere in uno dei due stati: off o on, e quindi tutto il codice del computer è fondamentalmente binario (lat. Binarius "costituito da due"). Il più piccolo raggruppamento di dati possibile in un sistema binario è un bit (una cifra binaria), che può essere organizzato in un gruppo di 8 chiamato byte. Poiché un singolo bit può avere due possibili valori (0 o 1), un byte può memorizzare 16 possibili stati.

0 o 1 (2)
0 o 1 (4)
0 o 1 (6)
0 o 1 (8)
0 o 1 (10)
0 o 1 (12)
0 o 1 (14)
0 o 1 (16)

Con ognuno di quegli 8 bit che hanno 2 possibili stati, ci sono un totale di 256 (2⁸) combinazioni possibili che possono essere memorizzate in un singolo byte.

https://cs.stackexchange.com/questions/19568/how-can-one-byte-hold-256-possibilities

Se dovessi mappare quei 256 possibili valori su un sistema decimale, avresti bisogno di tre cifre.

Decimale binario
00000000 000
00000001 001
00000010 002
00000011 003
....
01100011 009
....
11111111 255

Quindi è possibile, ma come nell'esempio del conteggio dei pesci con i segni di barra, non è il sistema più efficiente se la nostra unità di base è un singolo byte. Usando un sistema decimale base16, possiamo rappresentare qualsiasi possibile combinazione di bit di un singolo byte usando solo 2 cifre esadecimali. Dovremo usare qualche simbolo in più rispetto al sistema decimale, ma per motivi di efficienza, scalabilità e leggibilità umana ne vale la pena.

Le cifre esadecimali sono:

0 1 2 3 4 5 6 7 8 9 A B C D E F

dove

Dicembre esadecimale
 0 = 0
 1 = 1
 2 = 2
 3 = 3
 4 = 4
 5 = 5
 6 = 6
 7 = 7
 8 = 8
 9 = 9
10 = A
11 = B
12 = C
13 = D
14 = E
15 = F

Quindi 10 in decimale potrebbe essere scritto come A in esadecimale, salvando una cifra. Una volta raggiunta una quantità maggiore dell'esagono F (15 dicembre), dobbiamo ricominciare con 1 e una cifra segnaposto, 0.

Dicembre esadecimale
16 = 10

Ora, per rappresentare una quantità maggiore di 16, come 4 maggiore di 16 (20 in decimale), combiniamo solo le cifre esadecimali 10 e 4 per creare l'esagono 14.

Dicembre esadecimale
16 = 10
 4 = 4
Dicembre esadecimale
20 = 14

Una volta raggiunto l'esagono 1F (31 in decimale), ripetiamo e aumentiamo la prima cifra di una.

Dicembre esadecimale
...
 28 = 1D
 29 = 1E
 31 = 1F
 32 = 20
 33 = 21
 34 = 22
...

Possiamo seguire questo schema fino all'esagono FF, in cui possiamo ricominciare lo schema con 10 e un ulteriore 0: hex 100 (256 in decimale). Ogni ulteriore 0 aggiunto a destra rende il numero 16 volte maggiore del precedente.

Es. Dic
10 * 1 = 10 16 * 1 = 16
10 * 10 = 100 16 * 16 = 256
10 * 100 = 1000 16 * 256 = 4096
10 * 1000 = 10000 16 * 4096 = 65536
10 * 1000 + 1 = 10001 16 * 4096 + 1 = 65536
...

#portalo a casa

Quindi di nuovo su Marte - usando esadecimali invece delle lettere dell'alfabeto, il personaggio di Matt Damon è in grado di ridurre di 10 il numero di cifre possibili che può ricevere dalla Terra e riconoscere più facilmente la posizione della telecamera.

Questo grafico include anche ottali.

Il codice trasmesso dalla NASA deriva da una tabella ASCII (a sinistra), in cui ciascun valore esadecimale (in rosso) compreso tra 0 e 7F (0–127 in decimale) viene mappato a un singolo carattere. Per decodificare il messaggio, tutto ciò che Watney deve fare è far corrispondere i valori esadecimali alle lettere dell'alfabeto nella tabella.

48 4F 57 41 4C 49 56 45
H O W A L I V E

Che è essenzialmente tutto ciò che un computer sta facendo quando legge e produce dati.

Come ulteriore vantaggio, con tutto lo spazio offerto da soli 7 bit, la tabella ASCII include anche la punteggiatura (!), Quindi la NASA è in grado di trasmettere linee di codice che consentono a Watney di collegare il trasmettitore del Pathfinder al software di comunicazione più potente del rover Mars . Esadecimali in soccorso.

La tabella originale ASCII (American Standard Code for Information Interchange) è stata sviluppata negli Stati Uniti negli anni '60 e originariamente richiedeva solo 7 bit per la memorizzazione. La maggior parte della codifica di testo moderna utilizza 8 bit, ma si basa sul framework originale e quindi il sistema è ancora in uso fino ad oggi. Anche se non sei un programmatore, senza dubbio hai visto esadecimali utilizzati nel tuo browser web in un URL come: http://www.example.com/this%20is%20an%20example

dove% 20 (hex 20) viene mappato al carattere [spazio] nel grafico ASCII, poiché gli URL non possono accettare spazi vuoti e altri caratteri.

Un altro posto in cui avrai già visto esadecimali prima di scegliere i colori in qualsiasi software che consente la personalizzazione del colore dei valori RGB.

I bei vecchi tempi.

RGB sta per i colori primari: rosso, blu e verde. All'inizio dell'informatica, tre bit (0 o 1) potevano memorizzare il valore di una delle 8 (3²) combinazioni di colori possibili, dove 000 crea il nero (nessun colore), 111 ti dà il bianco (tutti i colori combinati) e il altri sei colori risultano dalle combinazioni in mezzo.

Il fatto che il colore sia solo discrepanze di lunghezza d'onda nella luce è un post sul blog per un altro giorno.

Aumentando la profondità di bit a 8 byte (24 bit), ciascun valore di colore R, G o B può memorizzare 256 livelli possibili in un singolo byte, consentendo 16.777.216 (2²⁴) colori possibili. Ciò aggiunge fino a otto cifre insignificanti in decimale10, ma ognuna di quelle sedici e più di milioni di combinazioni di colori può essere descritta in un formato leggibile dall'uomo usando solo 3 coppie di cifre esadecimali:
Nero = # 00000
Rosso = # FF0000
Blu = # 00FF00
Verde = # 0000FF
Bianco = #FFFFFF

È consuetudine abbreviare il numero quando si ripetono due cifre, quindi il valore esadecimale per # FFCC00 giallo scuro può anche essere scritto come # FC0.

Sono 16.763.904 in decimale10, per confronto.

Spero che questo post abbia demistificato esadecimali per te; So che la ricerca di questo argomento ha ulteriormente reso l'informatica molto meno schiacciante per me, il tutto ispirato al vincitore del 2015 per la migliore commedia e / o musical.