"Non c'è niente di meglio di un codice efficace, Amigo! Fidati di un vecchio robot."

"Stai parlando di cifrari usati dalle spie?"

"Certo che no. Sto parlando di presentare le informazioni in una forma digeribile. Dei sistemi numerici. Sai che nella vita di tutti i giorni la maggior parte delle persone usa il sistema decimale. Usa 10 simboli per rappresentare ogni numero: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Ci sono 10 numeri, quindi il sistema è chiamato decimale."

"Questo era conveniente per gli esseri umani con le loro dieci dita. Ma i programmatori sono grandi inventori. Hanno immediatamente escogitato codifiche che utilizzano un diverso numero di cifre. Ad esempio, 2, 8, 16 o 64 cifre. Lo hanno fatto per renderlo conveniente per i computer, che si basano su 'c'è un segnale / non c'è segnale'."

"Ah, capisco cosa hanno in comune... Tutti questi sistemi sono basati sulle potenze di due.

Codifica ottale

"Buona osservazione. Cominciamo con una codifica che coinvolge 8 cifre. Gli umani potrebbero trovarla la più semplice: basta eliminare i numeri 8 e 9 e - boom - hai la codifica ottale (sistema numerico). Di recente ti è stato detto dei letterali , giusto ?"

"Sì, lo ero."

"Beh, sorpresa! Puoi impostare letterali numerici codificati usando il sistema ottale. Se, ovviamente, ne hai davvero bisogno. È più facile di quanto sembri. Basta mettere 0 davanti al numero intero.

"Quindi se un letterale numerico inizia con zero, significa che è ottale ?"

"Sì, Java lo tratterà come ottale.

Esempi:

Codice Appunti
int x = 015; 
x è 13: 1*8+5
int x = 025; 
x è 21: 2*8+5
int x = 0123; 
x è 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Questo non verrà compilato: 8 non è uno dei simboli usati nella codifica ottale.

"È improbabile che tu debba scrivere numeri ottali nel tuo codice, ma dovresti sapere cosa sono. "Dopo tutto, dovrai leggere il codice scritto da altri. E come accennato in precedenza, i programmatori sono grandi inventori.

Bene, ricorda che non puoi semplicemente andare a scrivere 0 davanti a ogni numero."

"Ma se intendo che sia ottale, allora posso?"

"SÌ.

Codifica binaria

"Anche se non lo capisci ancora, la codifica binaria è la tua lingua madre. Lascia che te lo ricordi. Se l'ottale ha solo le cifre 0-7, allora il binario ha solo 0 e 1."

"Perché è necessaria questa codifica?"

"Come ho detto sopra, questo ha tutto a che fare con la struttura interna di un computer. Tutto in un computer funziona con l'elettricità e, come accade, il modo più efficiente per immagazzinare e trasmettere qualcosa usando l'elettricità è usare due stati: o non c'è elettricità nel filo (zero) e c'è elettricità (uno)."

"Ecco perché è così popolare... Hmm, sembra che comincio davvero a ricordare questa lingua!"

"Tutti i robot lo capiscono perfettamente. Sebbene non sia usato molto spesso in Java. Java è considerato un linguaggio di alto livello, completamente astratto dall'hardware su cui gira. In effetti, ti interessa davvero quale formato viene utilizzato per archiviare ed elaborare i dati dentro un computer?

"Ma negli ultimi decenni, i programmatori hanno imparato ad amare la codifica binaria (e altre codifiche basate su di essa). Di conseguenza, Java ha operatori che accettano numeri binari come input. E la precisione dei numeri in virgola mobile dipende dalla loro codifica binaria. rappresentazione.

"In breve, è meglio che tu sappia di questa codifica che non sapere."

"Giusto. E come nel caso della codifica ottale, Java ha un modo per codificare i letterali usando il sistema binario."

"Quindi saranno composti solo da 0 e 1?"

"Esattamente. Affinché il compilatore Java capisca che il codice contiene un valore letterale numerico codificato in binario anziché semplicemente un numero decimale costituito da zeri e uno, è consuetudine che tutti i valori letterali binari inizino con il prefisso 0b (il ' b ' deriva dalla parola binario).

Esempi:

Codice Appunti
int x = 0b100; 
х è 4: 1*4+0*2+0
int x = 0b1111; 
х è 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х è 967: 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0* 2 3 +1*2 2 +1*2+1;
int x = 0b12000;
Questo non verrà compilato: 2 non è uno dei simboli usati nella codifica binaria.

Codifica esadecimale

"Quanto fa due alla quarta potenza?"

"Sedici. Hai trovato la domanda giusta da fare a un robot che è arrivato fino a me!"

"Ti sembra di essere arrivato lontano. Comunque, sedici. Oltre alle codifiche ottali e binarie, i letterali possono anche essere scritti in esadecimale. Questa è una codifica molto popolare.

"Questo perché sebbene la notazione binaria sia il più vicino possibile al modo in cui i numeri sono effettivamente memorizzati, è troppo difficile per gli esseri umani lavorare efficacemente con tali numeri: in binario, il numero un milione di 20 cifre, non 7.

"Ecco perché i programmatori hanno inventato il sistema esadecimale. Dopotutto, come hai giustamente notato, 16 è 2 elevato alla quarta potenza, quindi esattamente 4 bit corrispondono a una cifra esadecimale.

"Quindi ora ogni 4 bit può essere scritto in una singola cifra esadecimale."

"Giusto. Anche la codifica esadecimale ha il suo prefisso univoco: 0x . Esempi:

Numero decimale Notazione binaria Notazione esadecimale
17 0b 0001 0001 0x11 _ _
4 1 0b 0010 1 00 1 0x29 _ _
85 0b 0101 0101 0x55 _ _
256 0b 1 0000 0000 0x 1 0 0

"Ok, quindi è abbastanza chiaro come abbiamo ottenuto il sistema ottale: abbiamo appena eliminato i numeri 8 e 9. Ma dove prendiamo le 6 cifre mancanti per il sistema esadecimale? Mi piacerebbe vederle!"

"È tutto semplice. Le prime 6 lettere dell'alfabeto inglese sono state prese come le 6 cifre mancanti: A (10), B (11), C (12), D (13), E (14), F (15) .

Esempi:

Notazione esadecimale Notazione binaria Numero decimale
0x1 _ 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x A 0b 0000 1010 10
0x b 0b 0000 1011 11
0x C 0b 0000 1100 12
0x D 0b 0000 1101 13
0x E 0b 0000 1110 14
0x F 0b 0000 1111 15
0x1 F _ 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x FF F _ 0b 1111 1111 1111 4095

"Come si converte un numero esadecimale in decimale?"

"È molto semplice. Diciamo che hai il numero 0 x A F C F . Quanto è in decimale? Primo, abbiamo un sistema numerico posizionale, il che significa che il contributo di ogni cifra al numero complessivo aumenta di un fattore di 16 mentre ci spostiamo da destra a sinistra:

LA * 16 3 + FA * 16 2 + DO * 16 1 + FA

Il simbolo A corrisponde al numero 10, la lettera C indica che abbiamo il numero 12 e la lettera F rappresenta quindici. Noi abbiamo:

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

Elevando 16 alle varie potenze che corrispondono alle cifre si ottiene:

10 * 4096 + 15 * 256 + 12 * 16 + 15

Riassumiamo tutto e otteniamo:

45007

"Ora sai come 45007 è memorizzato."

"Sì, lo voglio. È 0x A F C F "

"Ora convertiamolo in binario. In binario sarebbe:

0b 1010 1111 1100 1111

"Ogni set di quattro bit corrisponde esattamente a un carattere esadecimale. È super conveniente. Senza alcuna moltiplicazione o elevazione a potenza."