Восьмеричная и шестнадцатеричная системы счисления

Двоичные числа точны, но громоздки: уже число 200 занимает восемь знаков — 11001000. Чтобы записывать двоичные данные компактно, программисты используют восьмеричную и шестнадцатеричную системы. Их главное достоинство — мгновенный перевод в двоичную и обратно, без всяких делений.

Восьмеричная система

Основание — 8, цифры — от 0 до 7. Веса позиций: 1, 8, 64, 512… Например, 157₈ = 1 × 64 + 5 × 8 + 7 = 111₁₀.

Секрет её удобства: 8 = 2³, поэтому одна восьмеричная цифра — это ровно три двоичных разряда (триада).

ВосьмеричнаяДвоичнаяВосьмеричнаяДвоичная
00004100
10015101
20106110
30117111

Перевод из двоичной в восьмеричную: разбиваем число на триады справа налево и заменяем каждую на цифру. Переведём 11001000₂:

Триада11001000
Дополняем нулями слева011001000
Восьмеричная цифра310

Получили 310₈. Обратный перевод ещё проще: каждую цифру разворачиваем в триаду. Например, 52₈101 010101010₂.

Самое известное применение восьмеричной системы — права доступа в Unix: команда chmod 755 задаёт три триады бит — rwx r-x r-x. Цифра 7 — это 111 (читать, писать, исполнять), цифра 5 — 101 (читать и исполнять).

Шестнадцатеричная система

Основание — 16. Десяти арабских цифр не хватает, поэтому к ним добавляют буквы: A = 10, B = 11, C = 12, D = 13, E = 14, F = 15. Регистр не важен: ff и FF — одно и то же число 255.

Поскольку 16 = 2⁴, одна шестнадцатеричная цифра — это ровно четыре двоичных разряда (тетрада). Один байт записывается всего двумя символами: от 00 до FF.

ДесятичнаяДвоичнаяШестнадцатеричная
000000
501015
910019
101010A
111011B
121100C
131101D
141110E
151111F

Перевод в десятичную и обратно

Работает та же развёрнутая форма. Переведём 2F₁₆: 2 × 16 + 15 = 47₁₀. Покрупнее: 1A3₁₆ = 1 × 256 + 10 × 16 + 3 = 256 + 160 + 3 = 419₁₀.

Обратно — делением на 16. Переведём 419:

ДелениеЧастноеОстатокЦифра
419 ÷ 162633
26 ÷ 16110A
1 ÷ 16011

Читаем снизу вверх: 1A3₁₆. Заметьте: остаток 10 записывается буквой A.

Перевод в двоичную: тетрадами

Переведём B7₁₆ в двоичную систему: B — это 1011, 7 — это 0111. Склеиваем: 10110111₂. И обратно: 11001000₂ разбиваем на тетрады справа налево — 1100 и 1000 — и получаем C8₁₆. Никаких делений, чистая подстановка по таблице.

Где встречается шестнадцатеричная запись

  • Цвета в вебе. #FF6600 — это три байта: красный 255, зелёный 102, синий 0.
  • MAC-адреса. A4:5E:60:F1:23:9C — шесть байт адреса сетевой карты.
  • Адреса памяти. В отладчике указатели выглядят как 0x7ffee4c01a58.
  • Юникод. Символ обозначается кодом вида U+1F600.
  • Дампы файлов. Hex-редакторы показывают содержимое файла именно байтами в шестнадцатеричном виде.

Чтобы система была понятна без индексов, в коде используют префиксы: 0x для шестнадцатеричных чисел (0xFF), 0o для восьмеричных (0o755) и 0b для двоичных (0b1101).

Сравним все четыре системы

ДесятичнаяДвоичнаяВосьмеричнаяШестнадцатеричная
81000108
13110115D
64100000010040
25511111111377FF
4191101000116431A3

Что мы узнали

  • Восьмеричная (основание 8) и шестнадцатеричная (основание 16) системы — компактная запись двоичных данных.
  • Одна восьмеричная цифра равна трём двоичным разрядам, одна шестнадцатеричная — четырём.
  • Перевод между этими системами и двоичной делается группировкой разрядов, без делений.
  • В шестнадцатеричной системе цифры 10–15 записываются буквами A–F; один байт — это две hex-цифры.
  • Префиксы 0x, 0o и 0b указывают систему счисления в коде.
Проверьте себя
1. Чему равна восьмеричная цифра 7 в двоичном виде?
A011
B110
C101
D111
2. Что означает запись `chmod 755` в Unix?
AВладелец: rw-; группа: r--; остальные: r--
BВладелец: rwx; группа: r-x; остальные: r-x
CВсе пользователи: rwx
DВладелец: rwx; группа: rw-; остальные: r--
3. Сколько шестнадцатеричных символов нужно для записи одного байта?
A4
B3
C2
D8
4. Как быстро перевести двоичное число 11001000₂ в шестнадцатеричное?
AРазбить на группы по 3 бита справа налево и заменить каждую hex-цифрой
BРазбить на группы по 4 бита справа налево и заменить каждую hex-цифрой
CПеревести сначала в десятичную, затем в шестнадцатеричную
DРазбить на группы по 8 бит и заменить одной hex-цифрой
Поддержать проект