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).
Приклади:
Код | Примітки |
---|---|
|
х дорівнює 4: 1*4+0*2+0 |
|
х дорівнює 15: 1*8+1*4+1*2+1 |
|
х дорівнює 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 — число 15. Отримуємо:
10*163 + 15*162 + 12*161 + 15
Піднесемо 16 до степеня й отримаємо:
10*4096 + 15*256 + 12*16 + 15
Усе підсумуємо й отримаємо:
45007
Отепер ви знатимете, як це число зберігається в пам'яті:
0xAFCF
А зараз перетворімо його на двійкове число. У двійковій системі воно записується так:
0b1010111111001111
Кожним чотирьом бітам відповідає один символ шістнадцяткового кодування. Дуже зручно. Без усяких множень і піднесення до степеня.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ