"Nu există nimic mai bun decât codificarea eficientă, Amigo! Ai încredere într-un robot vechi."

— Vorbești despre cifrurile folosite de spioni?

„Bineînțeles că nu. Vorbesc despre prezentarea informațiilor într-o formă digerabilă. Despre sistemele numerice. Sunteți conștienți de faptul că în viața de zi cu zi majoritatea oamenilor folosesc sistemul zecimal. Folosește 10 simboluri pentru a reprezenta fiecare număr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Există 10 numere, așa că sistemul se numește zecimal.”

„Aceasta a fost convenabilă pentru oameni cu zece degete. Dar programatorii sunt inventatori mari. Au venit imediat cu codificări care folosesc un număr diferit de cifre. De exemplu, 2, 8, 16 sau 64 de cifre. Au făcut asta pentru fă-l convenabil pentru computere, care se bazează pe „există un semnal / nu există semnal”.

„Ah, văd ce au în comun... Toate aceste sisteme se bazează pe puteri a doi.

Codificare octală

„Bună observație. Să începem cu o codificare care implică 8 cifre. Oamenii ar putea găsi acest lucru cel mai ușor: trebuie doar să renunți la numerele 8 și 9 și — boom — ai codificarea octală (sistemul numeric). Recent ți s-a spus despre literale, corect . ?"

"Da, am fost."

„Ei bine, surpriză! Puteți seta literale numerice codificate folosind sistemul octal. Dacă, desigur, chiar aveți nevoie. Este mai ușor decât pare. Puneți 0 în fața întregului număr.

„Deci , dacă un literal numeric începe cu zero, înseamnă că este octal ?”

„Da, Java îl va trata ca octal.

Exemple:

Cod Note
int x = 015; 
x este 13: 1*8+5
int x = 025; 
x este 21: 2*8+5
int x = 0123; 
x este 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Aceasta nu va compila: 8 nu este unul dintre simbolurile utilizate în codificarea octală.

„Este puțin probabil să aveți nevoie să scrieți numere octale în codul dvs., dar ar trebui să știți care sunt acestea. „La urma urmei, va trebui să citiți codul scris de alții. Și așa cum am menționat mai sus, programatorii sunt mari inventatori.

Ei bine, amintiți-vă că nu puteți să scrieți 0 în fața fiecărui număr.”

— Dar dacă intenționez să fie octal, atunci pot?

"Da.

Codificare binară

"Chiar dacă nu o înțelegi încă, codificarea binară este limba ta maternă. Permiteți-mi să vă reamintesc despre asta. Dacă octalul are doar cifrele 0-7, atunci binarul are doar 0 și 1."

„De ce este necesară această codificare?”

„Așa cum am menționat mai sus, aceasta are totul de-a face cu structura internă a unui computer. Totul într-un computer funcționează pe bază de electricitate și, după cum se întâmplă, cel mai eficient mod de a stoca și transmite ceva folosind electricitate este să folosești două stări: fie nu există electricitate în fir (zero) și există electricitate (unu)."

"De aceea este atât de popular... Hmm, se pare că într-adevăr încep să-mi amintesc această limbă!"

"Toți roboții îl înțeleg perfect. Deși nu este folosit foarte des în Java. Java este considerat un limbaj de nivel înalt, complet abstractizat de hardware-ul pe care rulează. Într-adevăr, îți pasă cu adevărat ce format este folosit pentru stocarea și procesarea datelor în interiorul unui computer?

„Dar în ultimele decenii, programatorii au ajuns să iubească codificarea binară (și alte codificări bazate pe ea). Drept urmare, Java are operatori care iau numere binare drept intrări. Iar acuratețea numerelor în virgulă mobilă depinde de binarul lor. reprezentare.

„Pe scurt, este mai bine pentru tine să știi despre această codificare decât să nu știi.”

„Corect. Și așa cum a fost cazul cu codificarea octală, Java are o modalitate de a codifica literalele folosind sistemul binar.”

„Deci vor fi formați doar din 0 și 1?”

„Exact. Pentru ca compilatorul Java să înțeleagă că codul conține un literal numeric codificat în binar, mai degrabă decât un simplu număr zecimal format din zerouri și unu, este obișnuit ca toți literalii binari să înceapă cu prefixul 0b ( b ' vine de la cuvântul binar).

Exemple:

Cod Note
int x = 0b100; 
х este 4: 1*4+0*2+0
int x = 0b1111; 
х este 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х este 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;
Aceasta nu va compila: 2 nu este unul dintre simbolurile utilizate în codificarea binară.

Codificare hexazecimală

— Cât înseamnă două la a patra putere?

— Șaisprezece. Ți-ai dat seama ce trebuie să-i pui unui robot care a ajuns până la mine!

„Ti se pare că ai ajuns departe. Oricum, șaisprezece. Pe lângă codificările octale și binare, literalele pot fi scrise și în hexazecimal. Aceasta este o codificare foarte populară.

„Aceasta se datorează faptului că, deși notația binară este cât mai aproape posibil de modul în care sunt stocate efectiv numerele, este prea dificil pentru oameni să lucreze eficient cu astfel de numere: în binar, numărul un milion de 20 de cifre, nu 7.

„De aceea programatorii au venit cu sistemul hexazecimal. La urma urmei, după cum ați observat corect, 16 este 2 ridicat la a 4-a putere, deci exact 4 biți corespund unei cifre hexazecimale.

„Deci, fiecare 4 biți poate fi acum scris într-o singură cifră hexazecimală.”

„Corect. Codarea hexazecimală are și propriul prefix unic: 0x . Exemple:

Numar decimal Notație binară Notație hexazecimală
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, deci este suficient de clar cum am obținut sistemul octal: am aruncat doar numerele 8 și 9. Dar de unde obținem cele 6 cifre lipsă pentru sistemul hexazecimal? Aș dori să le văd!"

„Totul este simplu. Primele 6 litere ale alfabetului englez au fost luate ca fiind cele 6 cifre lipsă: A (10), B (11), C (12), D (13), E (14), F (15) .

Exemple:

Notație hexazecimală Notație binară Numar decimal
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

„Cum transformi un număr hexazecimal în zecimal?”

„Este foarte simplu. Să presupunem că aveți numărul 0 x A F C F . Cât este în zecimală? În primul rând, avem un sistem de numere pozițional, ceea ce înseamnă că contribuția fiecărei cifre la numărul total crește cu un factor de 16 pe măsură ce ne deplasăm de la dreapta la stânga:

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

Simbolul A corespunde cu numărul 10, litera C spune că avem numărul 12, iar litera F reprezintă cincisprezece. Primim:

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

Ridicând 16 la diferitele puteri care corespund cifrelor, obținem:

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

Rezum totul și obținem:

45007

„Acum știi cum este stocat 45007 în memorie.”

„Da, da. Este 0x A F C F

„Acum, să-l convertim în binar. În binar ar fi:

0b 1010 1111 1100 1111

„Fiecare set de patru biți corespunde exact unui caracter hexazecimal. Este foarte convenabil. Fără înmulțire sau exponențiere.”