"Det finns inget bättre än effektiv kodning, Amigo! Lita på en gammal robot."

"Pratar du om chiffer som används av spioner?"

"Naturligtvis inte. Jag pratar om att presentera information i en smältbar form. Om siffersystem. Du är medveten om att i vardagen använder de flesta decimalsystemet. Det använder 10 symboler för att representera varje tal: 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9. Det finns 10 siffror, så systemet kallas decimal."

"Det var bekvämt för människor med sina tio fingrar. Men programmerare är stora uppfinnare. De kom genast på kodningar som använder ett annat antal siffror. Till exempel 2, 8, 16 eller 64 siffror. De gjorde detta för att gör det bekvämt för datorer som förlitar sig på "det finns en signal / det finns ingen signal".

"Ah, jag ser vad de har gemensamt... Alla dessa system är baserade på tvåkrafter.

Oktal kodning

"Bra observation. Låt oss börja med en kodning som involverar 8 siffror. Människor kanske tycker att detta är det enklaste: släpp bara siffrorna 8 och 9 och — bom — du har den oktala kodningen (siffersystem). Du fick nyligen höra om bokstaver, eller hur ?"

"Ja, det var jag."

"Tja, överraskning! Du kan ställa in numeriska bokstaver kodade med det oktala systemet. Om du verkligen behöver det. Det är lättare än det låter. Sätt bara 0 framför hela talet .

"Så om en numerisk bokstav börjar med noll, betyder det att den är oktal? "

"Ja, Java kommer att behandla det som oktalt.

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 som skrivits av andra. Och som nämnts ovan är programmerare stora uppfinnare.

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

"Men om jag tänker att det ska vara oktalt, då kan jag det?"

"Ja.

Binär kodning

"Även om du inte förstår det ännu, är binär kodning ditt modersmål. Låt mig påminna dig om det. Om oktal bara har siffrorna 0-7, så har binär bara 0 och 1."

"Varför är denna kodning nödvändig?"

"Som jag nämnde ovan har detta allt att göra med den interna strukturen hos en dator. Allt i en dator körs 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 det finns ingen elektricitet i ledningen (noll) och det finns elektricitet (en)."

"Det är därför det är så populärt... Hmm, det verkar som att jag verkligen börjar komma ihåg det här språket!"

"Alla robotar förstår det perfekt. Även om det inte används 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 tal. representation.

"Kort sagt, det är bättre för dig att veta om denna kodning än att inte veta."

"Rätt. Och som var fallet med oktal kodning, har Java ett sätt att koda bokstaver med hjälp av det binära systemet."

"Så de kommer bara att bestå av 0:or och 1:or?"

"Exakt. 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, är det vanligt att alla binära literaler börjar med prefixet 0b ( b ' kommer från ordet binär).

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.

Hexadecimal kodning

"Vad är två till fjärde potens?"

"Sexton. Du kom på rätt fråga att ställa en robot som har kommit lika långt som mig!"

"Det verkar för dig som du har kommit långt. Hur som helst, sexton. Förutom oktala och binära kodningar kan bokstaver också skrivas i hexadecimal. 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, talet en miljon 20 siffror, inte 7.

"Det är därför programmerare kom med det hexadecimala systemet. När allt kommer omkring, som du korrekt noterade, är 16 2 upphöjt till 4:e potens, så exakt 4 bitar motsvarar en hexadecimal siffra.

"Så var fjärde bit kan nu skrivas med en enda hexadecimal siffra."

"Rätt. 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å 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 saknade siffrorna för det hexadecimala systemet? Jag skulle vilja se dem!"

"Allt är enkelt. De första 6 bokstäverna i det engelska alfabetet togs som de 6 saknade siffrorna: 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

"Hur konverterar du ett hexadecimalt tal till decimalt?"

"Det är väldigt 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 på 16 när vi rör oss från höger till vänster:

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

Symbolen A motsvarar siffran 10, bokstaven C säger att vi har 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

"Nu vet du hur 45007 lagras i minnet."

"Ja, det gör jag. Det är 0x A F C F "

"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 superbekvämt. Utan någon multiplikation eller exponentiering."