1. Oktal kodning

På tal om kodningar... Som ni vet använder vi i vardagen decimalnotation : alla våra tal representeras med 10 symboler: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Det finns 10 siffror, så systemet kallas decimal.

Men programmerare är stora uppfinnare. De kom genast på kodningar som använder ett annat antal symboler. Till exempel 16, 8 och 2.

Den alternativa kodningen som använder 8 symboler är den enklaste: släpp bara 8 och 9 och du får en oktal kodning (det oktala siffersystemet) .

Och ja, du kan använda det oktala systemet för att ange numeriska bokstaver. Om du verkligen behöver det såklart. Det är lättare än det låter. Du behöver bara skriva siffran 0 före siffran.

Med andra ord, Java behandlar varje heltalsliteral som börjar med 0 som ett oktalt värde.

Exempel:

Koda Anteckningar
int x = 015; 
x är 13:1*8+5
int x = 025; 
x är 21:2*8+5
int x = 0123; 
x är 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Detta kommer inte att kompileras: 8 är inte en av symbolerna som används i den oktala kodningen.

Det är osannolikt att du behöver skriva oktala tal i din kod, men du bör veta vad de är. När allt kommer omkring måste du läsa kod skriven av andra. Och som nämnts ovan är programmerare stora uppfinnare.

Tja, kom ihåg att du inte bara kan skriva 0 framför varje nummer.



2. Binär kodning

Binär kodning är ännu mer intressant. Om oktal bara har siffrorna 0-7, så har binär bara 0 och 1. Varför är denna kodning nödvändig?

Detta har allt att göra med den interna strukturen i en dator. Allt i en dator går på elektricitet, och som det händer är det mest effektiva sättet att lagra och överföra något med el att använda två tillstånd: antingen finns det ingen elektricitet i ledningen (noll) och det finns elektricitet (ett).

Detta är ursprunget till populariteten för det binära siffersystemet.

I princip används det inte särskilt ofta i Java: Java anses vara ett högnivåspråk, helt abstraherat från hårdvaran det körs på. Bryr du dig verkligen om vilket format som används för att lagra och bearbeta data inuti en dator?

Men under de senaste decennierna har programmerare kommit att älska den binära kodningen (och andra kodningar baserade på den). Som ett resultat har Java operatorer som tar binära tal som indata. Och noggrannheten hos flyttalstal beror på deras binära representation.

I grund och botten är det bättre för dig att veta om denna kodning än att inte veta.

Och som var fallet med oktal kodning, har Java ett sätt att koda bokstaver med hjälp av det binära systemet. Det vill säga bokstaver som bara består av 0:or och 1:or. För att Java-kompilatorn ska förstå att koden innehåller en numerisk literal kodad i binärt snarare än bara ett decimaltal som består av nollor och ettor, identifieras alla binära literaler med prefixet 0b ('b' kommer från ordet binary) .

Exempel:

Koda Anteckningar
int x = 0b100; 
х är 4: 1*4+0*2+0
int x = 0b1111; 
х är 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х är 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;
Detta kommer inte att kompileras: 2 är inte en av symbolerna som används i den binära kodningen.


3. Hexadecimal kodning

Förutom oktala och binära kodningar kan literaler också skrivas hexadecimalt. Detta är en mycket populär kodning.

Det beror på att även om binär notation är så nära som möjligt hur siffror faktiskt lagras, är det för svårt för människor att effektivt arbeta med sådana siffror: i binärt innehåller talet en miljon 20 siffror, inte 7.

Det är därför programmerare kom på det hexadecimala systemet. När allt kommer omkring är 16 2 höjt till 4:e potens, så exakt 4 bitar motsvarar en hexadecimal siffra. Grovt sett kan nu var 4:e bit skrivas som en enda hexadecimal siffra.

Den hexadecimala kodningen har också sitt eget unika prefix: 0x . Exempel:

Decimal nummer Binär notation Hexadecimal notation
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

Ok, säger du, det är tydligt nog hur vi fick det oktala systemet: vi kastade precis ut siffrorna 8 och 9, men var får vi de 6 extra symbolerna för det hexadecimala systemet? Jag skulle vilja se dem!

Det hela är okomplicerat. De första 6 bokstäverna i det engelska alfabetet togs som de 6 saknade symbolerna: A (10), B (11), C (12), D (13), E (14), F (15).

Exempel:

Hexadecimal notation Binär notation Decimal nummer
0x 1 0b 0000 0001 1
0x 9 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
0x 1 F 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095


4. Hur man konverterar ett tal från hexadecimal

Att konvertera ett tal från hexadecimalt till decimalt är mycket enkelt. Låt oss säga att du har talet 0 x A F C F . Hur mycket är det i decimal?

För det första har vi ett positionsnummersystem, vilket innebär att bidraget från varje siffra till det totala talet ökar med en faktor 16 när vi flyttar från höger till vänster:

A * 16 3 + F * 16 2 + C * 16 1 + F

Symbolen A motsvarar siffran 10, bokstaven C motsvarar siffran 12 och bokstaven F representerar femton. Vi får:

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

Om vi ​​höjer 16 till de olika potenserna som motsvarar siffrorna får vi:

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

Vi summerar allt och får:

45007

Du vet hur detta nummer lagras i minnet:

0x A F C F

Men låt oss nu konvertera det till binärt. I binärt skulle det vara:

0b 1010 1111 1100 1111

Varje uppsättning av fyra bitar motsvarar exakt ett hexadecimalt tecken. Det är super bekvämt. Utan någon multiplikation eller exponentiering."