1. Вісімкове кодування

До речі, про кодування. Як вам відомо, у повсякденному житті ми використовуємо десяткову систему числення: всі наші числа складаються з 10 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Оскільки цифр 10, то й система називається десятковою.

Одначе програмісти — великі вигадники, тому придумали різні кодування з іншою кількістю цифр. Наприклад, 64, 16, 8 і 2.

З кодуванням на основі 8 цифр було найпростіше: вони просто відкинули цифри 8 і 9 і отримали вісімкове кодування (вісімкову систему числення).

І тепер ви можете задавати числові літерали у вісімковій системі. Звичайно, якщо це вам потрібно. Це простіше, ніж здається. Просто слід написати перед числом цифру 0.

Тобто будь-який цілочисловий літерал, який починається з 0, у Java вважається вісімковим.

Приклади:

Код Примітки
int x = 015; 
х дорівнює 13: 1*8+5
int x = 025; 
х дорівнює 21: 2*8+5
int x = 0123; 
х дорівнює 83: 1*64+2*8+3 == 1*82+2*81+3*80
int x = 078;
Не скомпілюється: цифри 8 у вісімковому кодуванні немає.

Навряд чи вам знадобляться вісімкові числа в коді, проте слід знати, що це таке. Адже вам доведеться читати код, написаний іншими. А як ми вже казали, програмісти — великі вигадники.

Ну й пам'ятайте, що не можна просто так писати 0 попереду числа.



2. Двійкове кодування

Двійкове кодування — це ще цікавіше. Якщо у вісімковій системі залишилися тільки цифри 0–7, то у двійковій — тільки цифри 0 і 1. Навіщо ж потрібне таке кодування?

Це пов'язане з будовою комп'ютера. Усе в комп'ютері працює на електриці, і, як виявилося, найефективніший спосіб щось у ньому зберігати й передавати — це використовувати два стани: немає струму (нуль) і є струм (одиниця).

Оце і є основою популярності двійкового кодування.

Проте в Java воно використовується не так вже й часто: Java вважається мовою високого рівня, повністю незалежною від заліза, на якому працює. Справді, чи вам не все одно, в якому вигляді зберігаються й обробляються дані в комп'ютері?

Однак за минулі десятиліття програмісти полюбили двійкове кодування (і кодування на його основі), тому в Java є оператори, які під час роботи враховують двійкову форму числа. Та й точність дійсних чисел залежить від їх подання у двійковому кодуванні.

Взагалі, краще знати про це кодування, ніж не знати.

Так само, як і у випадку з літералами у вісімковій системі, у Java є спосіб задавати літерали у двійковій формі, тобто лише за допомогою символів 0 і 1. Для того щоб Java-компілятор зрозумів, що в коді записано числовий літерал у двійковій формі, а не просто десяткове число, що складається з нулів і одиниць, до всіх двійкових літералів додається префікс 0b (b від слова binary).

Приклади:

Код Примітки
int x = 0b100; 
х дорівнює 4: 1*4+0*2+0
int x = 0b1111; 
х дорівнює 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х дорівнює 967: 1*29+1*28+1*27+1*26+0*25+0*24+0*23+1*22+1*2+1;
int x = 0b12000;
Не скомпілюється: цифри 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

Кожним чотирьом бітам відповідає один символ шістнадцяткового кодування. Дуже зручно. Без усяких множень і піднесення до степеня.