"Nie ma nic lepszego niż skuteczne kodowanie, Amigo! Zaufaj staremu robotowi."

– Mówisz o szyfrach używanych przez szpiegów?

"Oczywiście, że nie. Mówię o przedstawieniu informacji w przystępnej formie. O systemach liczbowych. Zdajesz sobie sprawę, że w życiu codziennym większość ludzi posługuje się systemem dziesiętnym. Wykorzystuje on 10 symboli do przedstawienia każdej liczby: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Jest 10 cyfr, więc system nazywa się dziesiętnym.

„To było wygodne dla ludzi z ich dziesięcioma palcami. Ale programiści to wielcy wynalazcy. Natychmiast wymyślili kodowanie, które wykorzystuje inną liczbę cyfr. Na przykład 2, 8, 16 lub 64 cyfry. Zrobili to, aby sprawiają, że jest to wygodne dla komputerów, które polegają na „jest sygnał / nie ma sygnału”.

„Ach, widzę, co mają ze sobą wspólnego… Wszystkie te systemy opierają się na potęgach dwójki.

Kodowanie ósemkowe

„Dobra obserwacja. Zacznijmy od kodowania obejmującego 8 cyfr. Ludziom może się to wydawać najłatwiejsze: po prostu upuść cyfry 8 i 9 i — bum — masz kodowanie ósemkowe (system liczbowy). Niedawno powiedziano ci o literałach , prawda ?"

"Tak byłem."

„Cóż, niespodzianka! Możesz ustawić literały liczbowe zakodowane za pomocą systemu ósemkowego. Jeśli oczywiście naprawdę potrzebujesz. To prostsze niż się wydaje. Po prostu wstaw 0 przed liczbą całkowitą.

„Więc jeśli literał numeryczny zaczyna się od zera, czy to oznacza, że ​​jest ósemkowy ?”

„Tak, Java potraktuje to jako ósemkowe.

Przykłady:

Kod Notatki
int x = 015;
x wynosi 13: 1*8+5
int x = 025;
x wynosi 21: 2*8+5
int x = 0123;
x wynosi 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
To się nie skompiluje: 8 nie jest jednym z symboli używanych w kodowaniu ósemkowym.

„Jest mało prawdopodobne, że musisz pisać liczby ósemkowe w swoim kodzie, ale powinieneś wiedzieć, czym one są. W końcu będziesz musiał czytać kod napisany przez innych. Jak wspomniano powyżej, programiści to wielcy wynalazcy.

Cóż, pamiętaj, że nie możesz po prostu iść i napisać 0 przed każdą liczbą”.

„Ale jeśli chcę, żeby to było ósemkowe, to mogę?”

"Tak.

Kodowanie binarne

„Nawet jeśli jeszcze tego nie rozumiesz, kodowanie binarne jest twoim językiem ojczystym. Pozwól, że ci o tym przypomnę. Jeśli ósemkowy ma tylko cyfry 0-7, to binarny ma tylko 0 i 1”.

„Dlaczego to kodowanie jest konieczne?”

„Jak wspomniałem powyżej, ma to wszystko wspólnego z wewnętrzną strukturą komputera. Wszystko w komputerze działa na energię elektryczną, a tak się składa, że ​​najskuteczniejszym sposobem przechowywania i przesyłania czegoś za pomocą energii elektrycznej jest użycie dwóch stanów: albo w przewodzie nie ma prądu (zero) i jest prąd (jeden).”

"Dlatego jest tak popularny... Hmm, wygląda na to, że rzeczywiście zaczynam sobie przypominać ten język!"

„Wszystkie roboty doskonale to rozumieją. Chociaż w Javie nie jest to często używane. Java jest uważana za język wysokiego poziomu, całkowicie oderwany od sprzętu, na którym działa. Rzeczywiście, czy naprawdę obchodzi Cię, jaki format jest używany do przechowywania i przetwarzania danych wewnątrz komputera?

„Ale w ciągu ostatnich dziesięcioleci programiści pokochali kodowanie binarne (i inne oparte na nim kodowanie). W rezultacie Java ma operatory, które przyjmują liczby binarne jako dane wejściowe. A dokładność liczb zmiennoprzecinkowych zależy od ich binarności reprezentacja.

„Krótko mówiąc, lepiej wiedzieć o tym kodowaniu, niż nie wiedzieć”.

„Dobrze. I podobnie jak w przypadku kodowania ósemkowego, Java ma sposób na kodowanie literałów przy użyciu systemu binarnego”.

„Więc będą się składać tylko z zer i jedynek?”

„Dokładnie. Aby kompilator Javy zrozumiał, że kod zawiera literał liczbowy zakodowany binarnie, a nie po prostu liczbę dziesiętną składającą się z zer i jedynek, zwyczajowo wszystkie literały binarne zaczynają się od przedrostka 0b („b pochodzi od słowa binarny).

Przykłady:

Kod Notatki
int x = 0b100; 
х wynosi 4: 1*4+0*2+0
int x = 0b1111;
х wynosi 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х wynosi 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;
To się nie skompiluje: 2 nie jest jednym z symboli używanych w kodowaniu binarnym.

Kodowanie szesnastkowe

– Ile to jest dwa do potęgi czwartej?

„Szesnaście. Wymyśliłeś właściwe pytanie, aby zadać robotowi, który doszedł tak daleko, jak ja!”

„Wydaje ci się, że zaszedłeś daleko. W każdym razie szesnaście. Oprócz kodowania ósemkowego i binarnego literały można również zapisywać w systemie szesnastkowym. To bardzo popularne kodowanie.

„Dzieje się tak, ponieważ chociaż notacja binarna jest jak najbardziej zbliżona do rzeczywistego sposobu przechowywania liczb, ludziom zbyt trudno jest efektywnie pracować z takimi liczbami: w systemie binarnym liczba milion 20 cyfr, a nie 7.

„Dlatego programiści wymyślili system szesnastkowy. W końcu, jak słusznie zauważyłeś, 16 to 2 podniesione do czwartej potęgi, więc dokładnie 4 bity odpowiadają jednej cyfrze szesnastkowej.

„Więc każde 4 bity można teraz zapisać w jednej cyfrze szesnastkowej”.

„Racja. Kodowanie szesnastkowe ma również swój własny unikalny przedrostek: 0x . Przykłady:

Liczba dziesiętna Notacja binarna Notacja szesnastkowa
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x2 9 _
85 0b 0101 0101 0x5 5 _
256 0b 1 0000 0000 0x 1 0 0

„Ok, więc jest wystarczająco jasne, jak otrzymaliśmy system ósemkowy: po prostu wyrzuciliśmy liczby 8 i 9. Ale skąd weźmiemy 6 brakujących cyfr w systemie szesnastkowym? Chciałbym je zobaczyć!”

„Wszystko jest proste. Pierwsze 6 liter alfabetu angielskiego zostało potraktowanych jako 6 brakujących cyfr: A (10), B (11), C (12), D (13), E (14), F (15) .

Przykłady:

Notacja szesnastkowa Notacja binarna Liczba dziesiętna
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
0xD _ 0b 0000 1101 13
0xE _ 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 F F F 0b 1111 1111 1111 4095

„Jak przekonwertować liczbę szesnastkową na dziesiętną?”

„To bardzo proste. Powiedzmy, że masz liczbę 0 x A F C F . Ile to jest w systemie dziesiętnym? Po pierwsze, mamy system liczb pozycyjnych, co oznacza, że ​​udział każdej cyfry w ogólnej liczbie wzrasta o czynnik 16, gdy przechodzimy od prawej do lewej:

ZA * 16 3 + P * 16 2 + P * 16 1 + P

Symbol A odpowiada liczbie 10, litera C mówi, że mamy liczbę 12, a litera F reprezentuje piętnaście. Otrzymujemy:

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

Podnosząc 16 do różnych potęg odpowiadających cyfrom, otrzymujemy:

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

Sumujemy wszystko i otrzymujemy:

45007

„Teraz wiesz, jak 45007 jest przechowywany w pamięci”.

„Tak, mam. To jest 0x A F C F

„Teraz przekonwertujmy to na binarny. W systemie binarnym byłoby to:

0b 1010 1111 1100 1111

„Każdy zestaw czterech bitów odpowiada dokładnie jednemu znakowi szesnastkowemu. To bardzo wygodne. Bez mnożenia i potęgowania”.