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

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


Комментарии (684)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Кирилл Уровень 15
24 июня 2026
int x = 0b11110001111; x должен быть равен 1935: 1*2^10+1*2^9+1*2^8+1*2^7+0*2^6+0*2^5+0*2^4+1*2^3+ +1*2^2+1*2^1+1*2^0 = 1024+512+256+128+0+0+0+8+4+2+1 = 1935 В лекции ошибка.
Антон Уровень 12
20 апреля 2026
Я удивлен насколько отвратительное решение в ответе на последнюю задачу. Ребят, ну это стыдно такое за референс выдавать
Dmitry Уровень 11
13 апреля 2026
Дал слабину и отдохнул 3 дня меж 9м и 10м левлом.. Господь всемогущий.. Будто все нейронные связи потеряны. Таким тупым я еще себя не ощущал. JR: привет, вот тебе новая тема и 7 с половиной строчек текста Я: ок, неплохо, вроде понятно, но ты уже настраиваешь на ненадобность этой информации)) JR: дада, знаю. Держи хард левл, закрепляй <3 JR: ю шел нот пас грязный ублюдок, иди на завод болты крути
22 февраля 2026
инста скип, трата времени.
Denis Pereladov Уровень 40
10 декабря 2025
Вот это прикольные задачки, такое мне больше нравится. P.S. И массивы и циклы валидатор видит нормально всё. Я решал имеено через них, чтобы не строить длинные конструции "else-if". Более того, во второй части последней задачи я реализовал сразу в рамках одного цикла и преобразование и проверку на принадлежность символа к hex. Если символ hex, то произойдет преобразование и запись в строку, а если нет, цикл прервется и выдасту пустую строку. Все проверки валидатора нормально прошли, но не сразу. У меня была ошибка в цикле из-за которой он пропускал неправильный символ, если тот был в конце hex строки (например 9d0k). Но после её исправления все приняло.
Grigoryvvv Уровень 18 Expert
24 ноября 2025
24.11.2025 / 10 уровень
SUNSHINE Уровень 30
30 ноября 2025
Я видел сколько времени ты потратил на 10 уровень) Но мне лестно, что я тебя уже догоняю, пусть и только начал уровень 10 ;)
Maksim Grinko Уровень 13
7 ноября 2025
Это был ужОс))) Пол вечера на это прекрасное задание((((
Evgenii Petrov Уровень 1
28 октября 2025
Что бы приятнее было - рекомендую сначала прогонять код через "Запустить" и потом, как будет уверенность - только тогда через "проверить". Опыт программирования у меня есть, но я не буду строить и себя сеньора или мидла - было сложно. Напоминаю всем - мы только учимся! Не забывайте это! и боевые задачи сложные будут! Поисковик и ИИ "в зубы" и поехали решать! У нас все получится!
uki Уровень 16
18 сентября 2025
Было сложно только из-за отсутствия знаний о StringBuilder, не помню, был ли он раньше 😂
Zhenyok Avramenko Уровень 2
4 сентября 2025
решил ппервые два, дальше стало душно, дык и решение из маиериала который не проходили)))