1. Codifica ottale
A proposito di codifiche... Come sai, nella vita di tutti i giorni usiamo la notazione decimale : tutti i nostri numeri sono rappresentati usando 10 simboli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Ci sono 10 numeri, quindi il sistema è chiamato decimale.
Ma i programmatori sono grandi inventori. Immediatamente hanno escogitato codifiche che utilizzano un diverso numero di simboli. Ad esempio, 16, 8 e 2.
La codifica alternativa che utilizza 8 simboli è la più semplice: basta eliminare 8 e 9 e si ottiene una codifica ottale (il sistema numerico ottale ).
E, sì, puoi usare il sistema ottale per specificare letterali numerici. Se, ovviamente, ne hai davvero bisogno. È più facile di quanto sembri. Devi solo scrivere il numero 0 prima del numero.
In altre parole, Java tratta qualsiasi letterale intero che inizia con 0 come un valore ottale.
Esempi:
Codice | Appunti |
---|---|
|
x è 13: 1*8+5 |
|
x è 21: 2*8+5 |
|
x è 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0 |
|
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. Dopotutto, dovrai leggere il codice scritto da altri. E come accennato in precedenza, i programmatori sono grandi inventori.
Bene, ricorda che non puoi semplicemente scrivere 0 davanti a ogni numero.
2. Codifica binaria
La codifica binaria è ancora più interessante. Se l'ottale ha solo le cifre 0-7, allora il binario ha solo 0 e 1. Perché è necessaria questa codifica?
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 cavo (zero) e c'è elettricità (uno).
Questa è l'origine della popolarità del sistema numerico binario.
In linea di principio, non è 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 all'interno di 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 dispone di operatori che accettano numeri binari come input. E la precisione dei numeri in virgola mobile dipende dalla loro rappresentazione binaria.
Fondamentalmente, è meglio per te conoscere questa codifica che non sapere.
E come nel caso della codifica ottale, Java ha un modo per codificare i letterali usando il sistema binario. Cioè, letterali composti solo da 0 e 1. Affinché il compilatore Java comprenda che il codice contiene un valore letterale numerico codificato in binario anziché semplicemente un numero decimale composto da zeri e uno, tutti i valori letterali binari vengono identificati utilizzando il prefisso 0b ( la 'b' deriva dalla parola binario) .
Esempi:
Codice | Appunti |
---|---|
|
х è 4: 1*4+0*2+0 |
|
х è 15: 1*8+1*4+1*2+1 |
|
х è 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; |
|
Questo non verrà compilato: 2 non è uno dei simboli usati nella codifica binaria. |
3. Codifica esadecimale
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 contiene 20 cifre, non non 7.
Ecco perché i programmatori hanno inventato il sistema esadecimale. Dopotutto, 16 è 2 elevato alla quarta potenza, quindi esattamente 4 bit corrispondono a una cifra esadecimale. In parole povere, ogni 4 bit può ora essere scritto come una singola cifra esadecimale.
La codifica esadecimale ha anche il proprio 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, dici, è abbastanza chiaro come abbiamo ottenuto il sistema ottale: abbiamo appena eliminato i numeri 8 e 9, ma dove prendiamo i 6 simboli extra per il sistema esadecimale? vorrei vederli!
È tutto semplice. Le prime 6 lettere dell'alfabeto inglese sono state prese come i 6 simboli 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 |
4. Come convertire un numero da esadecimale
Convertire un numero da esadecimale a decimale è molto semplice. Diciamo che hai il numero 0 x A F C F . Quanto è in decimale?
Innanzitutto, abbiamo un sistema numerico posizionale, il che significa che il contributo di ciascuna cifra al numero complessivo aumenta di un fattore 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 corrisponde al 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
Sai come questo numero è memorizzato in memoria:
0x LAFCFA _ _ _
Ma 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 esponenziale."