"Wala nang mas mahusay kaysa sa epektibong coding, Amigo! Magtiwala sa isang lumang robot."

"Ang tinutukoy mo ba ay mga cipher na ginagamit ng mga espiya?"

"Siyempre hindi. Ang tinutukoy ko ay ang paglalahad ng impormasyon sa isang natutunaw na anyo. Tungkol sa mga numeral system. Alam mo na sa pang-araw-araw na buhay karamihan sa mga tao ay gumagamit ng decimal system . Gumagamit ito ng 10 simbolo upang kumatawan sa bawat numero: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Mayroong 10 numerals, kaya ang sistema ay tinatawag na decimal."

"Iyon ay maginhawa para sa mga tao gamit ang kanilang sampung daliri. Ngunit ang mga programmer ay big-time na imbentor. Agad silang nakaisip ng mga pag-encode na gumagamit ng ibang bilang ng mga digit. Halimbawa, 2, 8, 16, o 64 na mga numero. Ginawa nila ito upang gawin itong maginhawa para sa mga computer, na umaasa sa 'may signal / walang signal'."

"Ah, nakikita ko kung ano ang pagkakatulad nila... Lahat ng sistemang ito ay nakabatay sa kapangyarihan ng dalawa.

Octal encoding

"Magandang obserbasyon. Magsimula tayo sa isang pag-encode na may kasamang 8 digit. Maaaring makita ng mga tao na ito ang pinakamadali: i-drop lang ang mga numero 8 at 9 at — boom — mayroon kang octal encoding (numeral system). Kamakailan ay sinabihan ka tungkol sa mga literal , tama ?"

"Oo, ako noon."

"Buweno, sorpresa! Maaari kang magtakda ng mga numeric literal na naka-encode gamit ang octal system. Kung, siyempre, kailangan mo talaga .

"Kaya kung ang isang numeric literal ay nagsisimula sa zero, ibig sabihin ba nito ay octal ?"

"Oo, ituturing ito ng Java bilang octal.

Mga halimbawa:

Code Mga Tala
int x = 015; 
x ay 13: 1*8+5
int x = 025; 
ang x ay 21: 2*8+5
int x = 0123; 
x ay 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Hindi ito mag-compile: 8 ay hindi isa sa mga simbolo na ginamit sa octal encoding.

"Hindi malamang na kailangan mong magsulat ng mga octal na numero sa iyong code, ngunit dapat mong malaman kung ano ang mga ito. "Pagkatapos ng lahat, kailangan mong basahin ang code na isinulat ng iba. At tulad ng nabanggit sa itaas, ang mga programmer ay malalaking imbentor.

Buweno, tandaan na hindi ka maaaring pumunta at sumulat ng 0 sa harap ng bawat numero."

"Pero kung balak kong maging octal, kaya ko?"

"Oo.

Binary encoding

"Kahit hindi mo pa ito naiintindihan, ang binary encoding ay ang iyong katutubong wika. Paalalahanan kita tungkol dito. Kung ang octal ay may mga digit lamang na 0-7, ang binary ay mayroon lamang 0 at 1."

"Bakit kailangan ang encoding na ito?"

"Tulad ng nabanggit ko sa itaas, ito ay may kinalaman sa panloob na istraktura ng isang computer. Lahat ng bagay sa isang computer ay tumatakbo sa kuryente, at habang nangyayari ito, ang pinaka mahusay na paraan upang mag-imbak at magpadala ng isang bagay gamit ang kuryente ay ang paggamit ng dalawang estado: alinman walang kuryente sa wire (zero) at may kuryente (isa)."

"Kaya pala sikat na sikat ito... Hmm, mukhang nagsisimula na nga akong maalala ang wikang ito!"

"Naiintindihan ito ng lahat ng mga robot. Bagama't hindi ito madalas ginagamit sa Java. Ang Java ay itinuturing na isang mataas na antas ng wika, ganap na nakuha mula sa hardware na pinapatakbo nito. Sa katunayan, mahalaga ba sa iyo kung anong format ang ginagamit upang mag-imbak at magproseso ng data sa loob ng computer?

"Ngunit sa nakalipas na mga dekada, nagustuhan ng mga programmer ang binary encoding (at iba pang mga encoding batay dito). Bilang resulta, may mga operator ang Java na kumukuha ng mga binary na numero bilang mga input. At ang katumpakan ng mga floating-point na numero ay nakasalalay sa kanilang binary representasyon.

"Sa madaling salita, mas mabuting malaman mo ang tungkol sa encoding na ito kaysa hindi mo alam."

"Tama. At gaya ng nangyari sa octal encoding, may paraan ang Java para mag-encode ng mga literal gamit ang binary system."

"So bubuuin lang sila ng 0s and 1s?"

"Eksakto. Upang maunawaan ng Java compiler na ang code ay naglalaman ng isang numeric literal na naka-encode sa binary sa halip na isang decimal na numero na binubuo ng mga zero at isa, ito ay kaugalian para sa lahat ng binary literal na magsimula sa prefix na 0b (ang ' b ' ay mula sa salitang binary).

Mga halimbawa:

Code Mga Tala
int x = 0b100; 
х ay 4: 1*4+0*2+0
int x = 0b1111; 
х ay 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х ay 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;
Hindi ito mag-compile: 2 ay hindi isa sa mga simbolo na ginamit sa binary encoding.

Hexadecimal encoding

"Ano ang dalawa hanggang ikaapat na kapangyarihan?"

"Sixteen. Naisip mo ang tamang tanong para itanong sa isang robot na nakarating sa akin!"

"Mukhang malayo na ang narating mo. Anyway, labing-anim. Bilang karagdagan sa mga octal at binary encoding, ang mga literal ay maaari ding isulat sa hexadecimal. Ito ay isang napakapopular na encoding.

"Iyon ay dahil bagama't ang binary notation ay mas malapit hangga't maaari sa kung paano aktwal na iniimbak ang mga numero, napakahirap para sa mga tao na epektibong magtrabaho sa mga naturang numero: sa binary, ang bilang na isang milyon 20 digit, hindi 7.

"Iyon ang dahilan kung bakit ang mga programmer ay nakabuo ng hexadecimal system. Pagkatapos ng lahat, tulad ng tama mong nabanggit, ang 16 ay 2 ay itinaas sa ika-4 na kapangyarihan, kaya eksaktong 4 na bit ay tumutugma sa isang hexadecimal digit.

"Kaya ang bawat 4 na bit ay maaari na ngayong isulat sa isang solong hexadecimal digit."

"Tama. Ang hexadecimal encoding ay mayroon ding sarili nitong natatanging prefix: 0x . Mga halimbawa:

Desimal na numero Binary notation Hexadecimal notation
17 0b 0001 0001 0x 11 _
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, kaya sapat na malinaw kung paano namin nakuha ang octal system: itinapon lang namin ang mga numero 8 at 9. Ngunit saan namin kukunin ang 6 na nawawalang digit para sa hexadecimal system? Gusto ko silang makita!"

"Diretso lang ang lahat. Ang unang 6 na titik ng alpabetong Ingles ay kinuha bilang 6 na nawawalang numero: A (10), B (11), C (12), D (13), E (14), F (15) .

Mga halimbawa:

Hexadecimal notation Binary notation Desimal na numero
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

"Paano mo iko-convert ang isang hexadecimal na numero sa decimal?"

"Napakasimple nito. Sabihin nating mayroon kang numerong 0 x A F C F . Magkano iyon sa decimal? Una, mayroon tayong positional number system, na nangangahulugang ang kontribusyon ng bawat digit sa kabuuang bilang ay tumataas ng isang kadahilanan ng 16 habang lumilipat tayo mula kanan pakaliwa:

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

Ang simbolo A ay tumutugma sa numero 10, ang letrang C ay nagsasabing mayroon tayong numero 12, at ang letrang F ay kumakatawan sa labinlimang. Nakukuha namin:

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

Pagtaas ng 16 sa iba't ibang kapangyarihan na tumutugma sa mga digit, makukuha natin ang:

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

Binubuo namin ang lahat at nakukuha namin:

45007

"Ngayon alam mo na kung paano nakaimbak ang 45007 sa memorya."

"Oo, alam ko. Ito ay 0x A F C F "

"Ngayon, i-convert natin ito sa binary. Sa binary ito ay magiging:

0b 1010 1111 1100 1111

"Ang bawat hanay ng apat na bit ay tumutugma sa eksaktong isang hexadecimal na character. Iyan ay sobrang maginhawa. Nang walang anumang multiplikasyon o exponentiation."