— Нет ничего лучше эффективной кодировки, Амиго! Поверь старому роботу.

— Ты о шпионаже-шифрах-криптах?

— Нет конечно. Я о представлении информации в удобоваримом виде. Системах счисления. Ты же в курсе что в повседневной жизни большинство людей использует десятичную систему счисления. В ней все числа состоят из 10 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Цифр 10 штук, вот система и называется десятичной.

— Так было удобно человеку с его десятью пальцами. Однако программисты — большие выдумщики, и тут же придумали кодировки с другим количеством цифр. Например, 2, 8, 16, 64. Чтобы было удобно компьютеру с его “есть сигнал/нет сигнала”.

— Вот оно что… Все эти системы основаны на степенях двойки.

Восьмеричная кодировка

— Правильно подметил. Давай начнём с кодировкой из 8 цифр. С ней человеку проще всего: просто отбрось цифры 8 и 9 — и восьмеричная кодировка (система счисления) готова. Тебе тут недавно рассказывали про литералы?

— Было дело.

— Так вот, ты можешь, да-да, задавать числовые литералы в восьмеричной системе. Если, конечно, тебе это очень нужно. Это проще, чем кажется. Просто поставь перед целым числом цифру 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 впереди числа.

— Но если я задумал его восьмеричным, тогда — можно?

— Да.

undefined
9
Задача
Java Syntax Pro, 9 уровень, 2 лекция
Недоступна
Randomizer
В этой задаче тебе предстоит реализовать метод generateNumber(), который будет возвращать случайное число от 0 до 99. В методе generateNumber() используй метод Math.random().

Двоичная кодировка

— Пусть ты ещё этого и не понимаешь, но двоичная кодировка — твой родной язык. Напомню тебе его. Если в восьмеричной у нас остались только цифры 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 нет в двоичной кодировке.
undefined
9
Задача
Java Syntax Pro, 9 уровень, 2 лекция
Недоступна
Magic 8 ball
В этой задаче тебе предстоит реализовать метод getPrediction() в классе MagicBall, который будет работать как шар предсказаний. Он случайным образом возвращает фразу-ответ на заданный вопрос. В методе getPrediction() нужно использовать метод nextInt(int) класса Random, который должен возвращать знач

Шестнадцатеричная кодировка

— Два в четвёртой степени?

— Шестнадцать. Нашёл, что спросить у робота, который так далеко зашёл!

— Это тебе кажется, что далеко. Так вот, шестнадцать. Кроме восьмеричной и двоичной кодировок, литералы можно записывать и в шестнадцатеричной системе. Это очень популярная кодировка.

— Все дело в том, что двоичная запись хоть и максимально приближена к реальному виду хранения чисел, работать с таким числом человеку слишком сложно: миллион будет содержать не 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

— А как перевести шестнадцатеричное число в десятичное?

— Очень просто. Допустим, у тебя есть число 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

— Теперь ты знаешь, в каком виде 45007 хранится в памяти.

— Да, это 0xAFCF

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

0b1010111111001111

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