1. Kodowanie ósemkowe
Mówiąc o kodowaniu. Jak wiesz, w życiu codziennym posługujemy się systemem liczb dziesiętnych : wszystkie nasze liczby składają się z 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Jest 10 liczb, to to system o nazwie dziesiętny .
Jednak programiści są wielkimi wynalazcami i od razu wymyślili kodowanie z inną liczbą cyfr. Na przykład 64, 16, 8 i 2.
8-cyfrowe kodowanie jest najłatwiejsze: po prostu usunęli cyfry 8 i 9 i otrzymali kodowanie ósemkowe ( system liczb ósemkowych ).
I tak, możesz podać literały liczbowe w systemie ósemkowym. O ile oczywiście naprawdę tego nie potrzebujesz. To łatwiejsze niż się wydaje. Wystarczy wpisać cyfrę 0 przed liczbą.
Innymi słowy, każdy literał całkowity zaczynający się od 0 jest uważany przez Javę za ósemkowy.
Przykłady:
Kod | Notatki |
---|---|
|
x wynosi 13: 1*8+5 |
|
x wynosi 21: 2*8+5 |
|
x wynosi 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0 |
|
Nie skompiluje się: 8 nie jest w kodowaniu ósemkowym. |
Prawdopodobnie nie będziesz musiał pisać liczb ósemkowych w 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 napisać 0 przed liczbą.
2. Kodowanie binarne
Kodowanie binarne jest jeszcze bardziej interesujące. Jeśli w ósemkowym mamy tylko cyfry 0-7, to w dwójkowym mamy tylko cyfry 0 i 1. Po co nam takie kodowanie?
Wszystko zależy od urządzenia komputera. Wszystko w komputerze działa na prąd i okazuje się, że najskuteczniejszym sposobem przechowywania i przesyłania czegoś w nim jest użycie dwóch stanów: nie ma prądu w przewodzie (zero) i jest prąd (jeden).
Stąd wyrastają korzenie popularności kodowania binarnego.
Zasadniczo nie jest on często używany w Javie: Java jest uważana za język wysokiego poziomu, całkowicie oderwany od sprzętu, na którym działa. Rzeczywiście: czy ma dla Ciebie znaczenie, w jakiej formie dane są przechowywane i przetwarzane w komputerze?
Ale przez dziesięciolecia programiści pokochali kodowanie binarne (i oparte na nim kodowanie), więc Java ma operatory, które podczas pracy biorą pod uwagę postać binarną liczby. Tak, a dokładność liczb rzeczywistych zależy od ich reprezentacji w kodowaniu binarnym.
Generalnie lepiej wiedzieć o tym kodowaniu niż nie wiedzieć.
A w Javie, podobnie jak w przypadku kodowania ósemkowego, istnieje sposób na określenie literałów w kodowaniu binarnym. Te. składający się wyłącznie ze znaków 0 i 1. Aby kompilator Java zrozumiał, że kod zawiera literał liczbowy w kodowaniu binarnym, a nie tylko liczbę dziesiętną składającą się z zer i jedynek, wszystkie literały binarne są poprzedzone 0 b (b od słowa binarny).
Przykłady:
Kod | Notatki |
---|---|
|
x wynosi 4: 1*4+0*2+0 |
|
x wynosi 15: 1*8+1*4+1*2+1 |
|
x 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; |
|
Nie skompiluje się: cyfra 2 nie jest zakodowana binarnie. |
3. Kodowanie szesnastkowe
Oprócz kodowania ósemkowego i binarnego literały można również zapisywać w systemie szesnastkowym. To bardzo popularne kodowanie.
Chodzi o to, że notacja binarna, choć jak najbardziej zbliżona do rzeczywistej formy przechowywania liczb, jest zbyt trudna dla osoby do pracy z taką liczbą: milion będzie zawierał nie 7 cyfr, ale 20.
Więc programiści wymyślili system szesnastkowy. W końcu 16 to 2 4 , więc dokładnie 4 bity odpowiadają jednej cyfrze szesnastkowej. Z grubsza mówiąc, każde 4 bity można teraz zapisać jako jedną cyfrę szesnastkową.
Kodowanie szesnastkowe ma również swój własny unikalny przedrostek - 0 x . Przykłady:
Liczba dziesiętna | Notacja binarna | Notacja szesnastkowa |
---|---|---|
17 | 0b 0001 0001 | 0x11 _ _ |
4 1 | 0b 0010 1 00 1 | 0x29 _ _ |
85 | 0b 0101 0101 | 0x55 _ _ |
256 | 0b 1 0000 0000 | 0x100 _ _ _ |
Ok, pytasz, jasne jest, jak uzyskać system ósemkowy: właśnie wyrzuciliśmy liczby 8 i 9, ale skąd weźmiemy 6 brakujących cyfr w systemie szesnastkowym? Chciałbym je zobaczyć!
Tutaj wszystko jest dość proste. Pierwsze 6 liter alfabetu angielskiego przyjęto 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 |
0xB _ | 0b 0000 1011 | jedenaście |
0x C | 0b 0000 1100 | 12 |
0xD _ | 0b 0000 1101 | 13 |
0xE _ | 0b 0000 1110 | 14 |
0xF_ _ | 0b 0000 1111 | 15 |
0x1F _ _ | 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. Jak przetłumaczyć liczbę z kodowania szesnastkowego
Konwersja liczby z szesnastkowej na dziesiętną jest bardzo łatwa. Powiedzmy, że masz liczbę 0 x A F C F . Ile to będzie w systemie dziesiętnym?
Po pierwsze mamy pozycyjny system liczbowy, co oznacza, że każda cyfra zwiększa wartość liczby 16 razy:
ZA * 163 + F * 162 + C * 161 + F _ _ _
Symbol A odpowiada liczbie 10, symbol C odpowiada liczbie 12, symbol F odpowiada liczbie piętnaście. Otrzymujemy:
10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15
Podnosimy 16 do potęgi i otrzymujemy:
10 * 4096 + 15 * 256 + 12 * 16 + 15
Podsumujmy wszystko i otrzymajmy:
45007
Ale teraz wiesz, jak ta liczba jest przechowywana w pamięci:
0x A F C F
Teraz przekonwertujmy to na kodowanie binarne. W systemie binarnym byłoby to:
0b 1010 1111 1100 1111
Każde cztery bity odpowiadają dokładnie jednemu znakowi szesnastkowemu. Bardzo komfortowo. Bez mnożenia i potęgowania.