JavaRush /Курсы /Java Syntax Pro /Кодировки

Кодировки

Java Syntax Pro
9 уровень , 1 лекция
Открыта

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 — пятнадцать. Получаем:

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

Возведем 16 в степень и получим:

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

Просуммируем все и получим:

45007

Зато теперь вы знаете, как это число хранится в памяти:

0xAFCF

А теперь преобразуем его в двоичную кодировку. В двоичной это будет:

0b1010111111001111

Каждым четырём битам соответствует ровно один символ шестнадцатеричной кодировки. Очень удобно. Без всяких умножений и возведений в степень.


Комментарии (680)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Denis Pereladov Уровень 24
10 декабря 2025
Вот это прикольные задачки, такое мне больше нравится. P.S. И массивы и циклы валидатор видит нормально всё. Я решал имеено через них, чтобы не строить длинные конструции "else-if". Более того, во второй части последней задачи я реализовал сразу в рамках одного цикла и преобразование и проверку на принадлежность символа к hex. Если символ hex, то произойдет преобразование и запись в строку, а если нет, цикл прервется и выдасту пустую строку. Все проверки валидатора нормально прошли, но не сразу. У меня была ошибка в цикле из-за которой он пропускал неправильный символ, если тот был в конце hex строки (например 9d0k). Но после её исправления все приняло.
Grigoryvvv Уровень 13 Expert
24 ноября 2025
24.11.2025 / 10 уровень
SUNSHINE Уровень 14
30 ноября 2025
Я видел сколько времени ты потратил на 10 уровень) Но мне лестно, что я тебя уже догоняю, пусть и только начал уровень 10 ;)
Maksim Grinko Уровень 10
7 ноября 2025
Это был ужОс))) Пол вечера на это прекрасное задание((((
Evgenii Petrov Уровень 10
28 октября 2025
Что бы приятнее было - рекомендую сначала прогонять код через "Запустить" и потом, как будет уверенность - только тогда через "проверить". Опыт программирования у меня есть, но я не буду строить и себя сеньора или мидла - было сложно. Напоминаю всем - мы только учимся! Не забывайте это! и боевые задачи сложные будут! Поисковик и ИИ "в зубы" и поехали решать! У нас все получится!
uki Уровень 16
18 сентября 2025
Было сложно только из-за отсутствия знаний о StringBuilder, не помню, был ли он раньше 😂
Valdimir Уровень 11
11 сентября 2025
Готовьтесь морально, но 4 задача убивает...
Zhenyok Avramenko Уровень 19
4 сентября 2025
решил ппервые два, дальше стало душно, дык и решение из маиериала который не проходили)))
Gris Hiver Уровень 1
10 августа 2025
Это все конечно "интересно", но пропущу-ка я эти 4 задания
Anton Pohodin Уровень 26
9 декабря 2025
Зачем пропускать-то? Открываешь Ответы - и просто делаешь по-своему. Это намного приятнее и интереснее, чувствуешь себя настоящим IT-инженером, занимающимся рефакторингом :)
Михаил Уровень 1
26 июля 2025
Вторая задача, проверка "Если входящий параметр — пустая строка или null, то метод toDecimal(String) возвращает 0" Валидатор не принимает: public static int toDecimal(String binaryNumber) { int x = 0; char symbol = ' '; int c = 0; int b = binaryNumber.length(); if (!(binaryNumber == null || binaryNumber == "")) { { for (int i = 0; i < b; i++) { symbol = binaryNumber.charAt(b-i-1); c = symbol == '0' ? 0 : 1; x = x + c * (int) Math.pow(2, i); } } return x; } else { return 0; } } Однако принимает: public static int toDecimal(String binaryNumber) { int decimalNumber = 0; if (binaryNumber == null) { return decimalNumber; } for (int i = 0; i < binaryNumber.length(); i++) { int index = binaryNumber.length() - 1 - i; int value = Character.getNumericValue(binaryNumber.charAt(index)); decimalNumber += value * Math.pow(2, i); } return decimalNumber; } Я чего-то не понимаю, или все-таки в "правильном" решении есть только проверка на null, а проверка на пустую строку отсутствует в принципе? Два часа времени потрачены на прохождение этой проверки, и потрачены впустую.
Кот Уровень 19
17 июля 2025
Условие задачи содержит неоднозначность: Если входящий параметр метода toBinary(String) содержит любой символ, кроме цифр от 0 до 9 или латинскую букву от a до f (в нижнем регистре), то метод возвращает пустую строку. Т.е., если параметр содержит тра-та-та или латинскую букву от a до f ( в нижнем регистре), то метод возвращает пустую строку. Или если параметр содержит любой символ кроме (тра-та-та ) или латинскИХ букв от a до f ( в нижнем регистре), то метод возвращает пустую строку. непонятно!
Eugene Volkov Уровень 35
18 сентября 2025
чтобы перевести из шестнадцатеричной в двоичную систему счисления логичнее 2ой вариант. и я по нему делал. но валидатор не принял. массивы и циклы для проверки он видеть ,похоже,не хочет