Кодировки

Открыта

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

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

— Нет конечно. Я о представлении информации в удобоваримом виде. Системах счисления. Ты же в курсе что в повседневной жизни большинство людей использует десятичную систему счисления. В ней все числа состоят из 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 впереди числа.

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

— Да.

3
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
Возвращаем StackTrace
Принцип стека несправедлив и суров. Но иногда так полезен! Помните, что функция, вызванная последней, должна завершиться самой первой. Давайте попрактикуемся и посмотрим, что из этого выйдет: нам нужно написать пять методов, которые вызывают друг друга. Каждый метод должен возвращать свой StackTrace.

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

— Пусть ты ещё этого и не понимаешь, но двоичная кодировка — твой родной язык. Напомню тебе его. Если в восьмеричной у нас остались только цифры 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 нет в двоичной кодировке.
6
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
И снова StackTrace
Давайте сразу перейдем к делу: напишите 5 методов, которые вызывают друг друга. Каждый метод должен возвращать имя метода, вызвавшего его, полученное с помощью StackTrace. Это имя — дальше, чем звезды. Но мы разберемся, это всего-навсего методы, которые последовательно вызывают друг друга, и ничего более.

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

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

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

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

— Все дело в том, что двоичная запись хоть и максимально приближена к реальному виду хранения чисел, работать с таким числом человеку слишком сложно: миллион будет содержать не 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 0b11110001 255
0xFFF 0b111111111111 4095
3
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
Кто меня вызывал?
Стек вызовов, может, не самая красивая конструкция… Хотя почему нет? Он логичен, к нему просто привыкнуть нужно. Привыкаем с задачами! В этот раз вам нужно написать пять методов, которые вызывают друг друга. Метод должен вернуть номер строки кода, из которого вызвали этот метод. Для этого воспользуйтесь функцией: element.getLineNumber().

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

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

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

3
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
Стек-трейс длиной 10 вызовов
Мне повезло: в младших классах Марья Ивановна вечно писала на доске фразу: «Функция, вызванная последней, должна завершиться самой первой». И заставляла выучить её на память, заверяя, что когда-нибуть поймем. Спасибо, Марья Ивановна, кажется, этот день настал. Я даже могу написать код, чтобы получить стек-трейс длиной 10 вызовов. А вы можете?
3
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
Там, в синих глубинах стек-трейса…
Помните золотое правило: функция А вызывает функцию Б, а та вызывает функцию В. И чтобы выйти из А, надо сначала выйди из Б, а для этого надо выйти из В. Вспомнили? Вот и хорошо. А теперь напишем метод, который возвращает результат – глубину его стек-трейса – количество методов в нем (количество элементов в списке). И ещё: пускай это число метод выведет на экран.
3
Задача
Java Syntax,  9 уровень,  2 лекция
Недоступна
Логирование стек-трейса
Если вы занимаесь чем-то более или менее серьезно, вы, так или иначе, придете к логированию. Не медлим, реализуем метод log. Он должен выводить на экран имя класса и имя метода (в котором вызывается метод log), а также переданное сообщение. Имя класса, имя метода и сообщение разделим для наглядности двоеточием с пробелом.
Комментарии (2)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dmitriy_Dalton 9 уровень, Санкт-Петербург
6 сентября 2020, 12:07
— Было дело. Надо выделить синим.
Лимон Лютый в Бешоный
20 августа 2020, 15:18
24 вместо 2 в 4 "— Поэтому программисты придумали шестнадцатеричную систему. Ведь 16, как ты правильно подметил, это 24, поэтому одной шестнадцатеричной цифре соответствует ровно 4 бита."