1. Восьмиричне кодування
До речі, про кодування. Як ви знаєте, в повсякденному житті ми використовуємо десяткову систему числення: усі наші числа складаються із 10 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Цифр 10 штук, ось система і називається десятковою.
Проте програмісти — великі вигадники, і одразу придумали кодування з іншою кількістю цифр. Наприклад, 64, 16, 8 і 2.
З кодуванням із 8 цифр найпростіше: вони просто відкинули цифри 8 і 9 і отримали восьмиричне кодування (восьмиричну систему числення).
І ви можете, так-так, задавати числові літерали у восьмиричній системі. Якщо, звісно, вам це дуже потрібно. Це простіше, ніж здається. Вам потрібно просто перед числом написати цифру 0.
Іншими словами, будь-який цілочисельний літерал, що починається з 0, вважається Java восьмиричним.
Приклади:
| Код | Примітки |
|---|---|
|
х дорівнює 13: 1*8+5 |
|
х дорівнює 21: 2*8+5 |
|
х дорівнює 83: 1*64+2*8+3 == 1*82+2*81+3*80 |
|
Не скомпілюється: цифри 8 немає у восьмиричному кодуванні. |
Навряд чи вам знадобиться писати восьмиричні числа у коді, однак ви повинні знати, що це таке. Адже вам доведеться читати код, написаний іншими. А як вже згадувалося, програмісти — великі вигадники.
Ну і запам'ятайте, що не можна просто так писати 0 перед числом.
2. Двійкове кодування
Двійкове кодування ще цікавіше. Якщо у восьмеричному у нас залишилися тільки цифри 0-7, то у двійковому залишилися тільки цифри 0 і 1. Навіщо ж потрібне таке кодування?
Справа в пристрої комп'ютера. Усе в комп’ютері працює на електриці, і як виявилося, найефективніший спосіб щось у ньому зберігати і передавати — використовувати два стани: немає електрики в проводі (нуль) і є електрика (одиниця).
Ось звідси й ростуть корені популярності двійкового кодування.
У принципі в Java воно використовується не так уже й часто: Java вважається мовою високого рівня, повністю абстрагованою від заліза, на якому виконується. Дійсно: чи не все одно вам, у якому вигляді зберігаються й обробляються дані всередині комп’ютера?
Але за минулі десятиліття програмісти полюбили двійкове кодування (і кодування, засновані на ньому), тому в Java є оператори, які при роботі враховують двійкову форму числа. Та й точність чисел з рухомою комою залежить від їхнього представлення в двійковому кодуванні.
Загалом, краще знати про це кодування, ніж не знати.
І в Java, як у випадку з восьмеричним кодуванням, є спосіб задати літерали в двійковому кодуванні. Тобто складені тільки з символів 0 і 1. Щоб Java-компілятор зрозумів, що в коді записаний числовий літерал у двійковому кодуванні, а не просто десяткове число, що складається з нулів і одиниць, усі двійкові літерали вказуються з префіксом 0b (b від слова binary).
Приклади:
| Код | Примітки |
|---|---|
|
x дорівнює 4: 1*4+0*2+0 |
|
x дорівнює 15: 1*8+1*4+1*2+1 |
|
x дорівнює 967: 1*29+1*28+1*27+1*26+0*25+0*24+0*23+1*22+1*2+1; |
|
Не скомпілюється: цифри 2 немає в двійковому кодуванні. |
3. Шістнадцяткове кодування
Окрім вісімкового і двійкового кодування, літерали можна записувати і в шістнадцятковій системі. Це дуже популярне кодування.
Вся справа в тому, що двійковий запис хоч і максимально наближений до реального виду збереження чисел, працювати з таким числом людині дуже складно: мільйон міститиме не 7 цифр, а 20.
Тому програмісти вигадали шістнадцяткову систему. Адже 16 — це 24, тому одній шістнадцятковій цифрі відповідає рівно 4 біта. Грубо кажучи, кожні 4 біта тепер можна записати однією шістнадцятковою цифрою.
У шістнадцяткового кодування теж є свій унікальний префікс — 0x. Приклади:
| Десяткове число | Двійковий запис | Шістнадцятковий запис |
|---|---|---|
| 17 | 0b00010001 | 0x11 |
| 41 | 0b00101001 | 0x29 |
| 85 | 0b01010101 | 0x55 |
| 256 | 0b100000000 | 0x100 |
Добре, запитаєте ви, зрозуміло, як отримати вісімкову систему: ми просто виключили цифри 8 і 9, але де взяти 6 відсутніх цифр для шістнадцяткової системи? Хотілося б їх побачити!
Тут все досить просто. Як 6 відсутніх цифр взяли 6 перших літер англійського алфавіту: A (10), B (11), C (12), D (13), E (14), F (15).
Приклади:
| Шістнадцятковий запис | Двійковий запис | Десяткове число |
|---|---|---|
| 0x1 | 0b00000001 | 1 |
| 0x9 | 0b00001001 | 9 |
| 0xA | 0b00001010 | 10 |
| 0xB | 0b00001011 | 11 |
| 0xC | 0b00001100 | 12 |
| 0xD | 0b00001101 | 13 |
| 0xE | 0b00001110 | 14 |
| 0xF | 0b00001111 | 15 |
| 0x1F | 0b00011111 | 31 |
| 0xAF | 0b10101111 | 175 |
| 0xFF | 0b11111111 | 255 |
| 0xFFF | 0b111111111111 | 4095 |
4. Як перевести число з шістнадцяткової системи
Перевести число з шістнадцяткової у десяткову систему дуже просто. Припустимо, у тебе є число 0xAFCF. Скільки це буде у десятковій?
По-перше, у нас позиційна система числення, а значить, кожен розряд збільшує значення цифри у 16 разів:
A*163 + F*162 + C*161 + F
Символу А відповідає число 10, символу C відповідає число 12, символу F — п'ятнадцять. Отримуємо:
10*163 + 15*162 + 12*161 + 15
Зведемо 16 у ступінь і отримаємо:
10*4096 + 15*256 + 12*16 + 15
Просумуємо все і отримаємо:
45007
Зате тепер ти знаєш, як це число зберігається в пам'яті:
0xAFCF
А тепер перетворимо його у двійкову систему. У двійковій це буде:
0b1010111111001111
Кожним чотирьом бітам відповідає рівно один символ шістнадцяткової системи. Дуже зручно. Без всяких множень і зведень у ступінь.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ