JavaRush /Курси /Java Syntax Zero /Кодування

Кодування

Java Syntax Zero
Рівень 10 , Лекція 2
Відкрита

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; 
x дорівнює 4: 1*4+0*2+0
int x = 0b1111; 
x дорівнює 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
x дорівнює 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 — п'ятнадцять. Отримуємо:

10*163 + 15*162 + 12*161 + 15

Зведемо 16 у ступінь і отримаємо:

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

Просумуємо все і отримаємо:

45007

Зате тепер ти знаєш, як це число зберігається в пам'яті:

0xAFCF

А тепер перетворимо його у двійкову систему. У двійковій це буде:

0b1010111111001111

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


Коментарі (45)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Artem Рівень 40
28 травня 2025
я взагалі не можу врубитися з цими кодами! (
Julia Рівень 23
4 січня 2025
залишу перший комент в 2025 :)
Jaroslav Рівень 48
21 листопада 2024
Задача "Двійково-шістнадцятковий конвертер" прямо круть Вдалося вирішити її більш елегантним способом через цикл замість купи else if Upd: Пізніше вдалося навіть відмовитися від циклу на користь стандартних функцій Java
Sergey Рівень 13
4 жовтня 2024
Оооо, нарешті завдання стали складнішими, і треба трохи подумати, а не просто переписати приклад із лекції. Чим далі в ліс - тим цікавіше :))
gummer Рівень 11
9 березня 2024
Як я вже сердешно втомився витрачати СВІЙ вільний час на те, аби "намахати" ваш автоперевіряльник Я витратив практично годину на те, аби зрозуміти, ЧОМУ моє правильне рішення ваша перевірялка не приймає, і в кінцевому результаті просто копіпастнув ваш код, аби просто отримати темну матерію Далеко не вперше стикаюсь з цією проблемою
Ва Дим Рівень 28
31 березня 2024
Незнаю. нормально він працює.
Alla Voloshchuk Рівень 22
25 січня 2024
Маю зауваження стосовно запропонованого рішення для 4ї задачі: рішення пропонує використовувати if/else умову для кожного варіанта відповіді (binaryNumber.length() % 4). Як на мене таке рішення неоптімальне. Вже була пройдена тема циклів і клас String. То чому не використати набуті знання в рішенні задачі і записати ту ж умову тільки один раз у циклі while, додаючи на кожному кроці циклу ще один "0" на початок рядка? Я використала таке рішення, але система сприйняла його як неправильне.
18 лютого 2024
int a = 4 - binaryNumber.length()%4; // если не хватает 3 символов, то присваиваем это кол-во if (a!=4) { // если делиться на 4 без остатка, то проверяем это for (int b=0; b<a; b++) {binaryNumber=0+binaryNumber;} //Присваиваем 0 спереди в цикле } Вот мое решение по Вашим идеям. У меня работает.
Olexandr Рівень 47
27 листопада 2023
Так, і хочу ще добавити, що задачі не такі вже і складні... Правда четверту задачу я майже наполовину списав, тому що почав писати її через цикли і масив зі значеннями, і наглухо заплутався в перетвореннях int в String i StringBuilder objects... Але я повністю розібрався в способах кодування та які методи застосовуються. Да, заставили нагуглити те, що буде вивчатися буквально через пару лекцій... Але ж і на роботі буде так само...
Олександр Рівень 18
11 листопада 2023
людоньки, зробіть нормальний переклад! або хочаб поясніть яке слово що означає!
Vitalii Рівень 11
18 серпня 2023
дивно... то вони числа в пишуть як інти...то як рядки.... чорт ногу зломить...
Oleksandr Davydiuk Рівень 20
8 липня 2023
Щось я у правильному рішенні не знайшов перевірки: "Якщо вхідний параметр методу toHex(String) містить символи, відмінні від 0 і 1, метод повертає порожній рядок." Скопіював код до ідеї і от що в мене вийшло: Двійкове число 100112010000 дорівнює шістнадцятковому числу 900 А шіснадцяткове число 900 це в двійковому 100100000000