Восьмеричная и шестнадцатеричная системы счисления
Двоичные числа точны, но громоздки: уже число 200 занимает восемь знаков — 11001000. Чтобы записывать двоичные данные компактно, программисты используют восьмеричную и шестнадцатеричную системы. Их главное достоинство — мгновенный перевод в двоичную и обратно, без всяких делений.
Восьмеричная система
Основание — 8, цифры — от 0 до 7. Веса позиций: 1, 8, 64, 512… Например, 157₈ = 1 × 64 + 5 × 8 + 7 = 111₁₀.
Секрет её удобства: 8 = 2³, поэтому одна восьмеричная цифра — это ровно три двоичных разряда (триада).
| Восьмеричная | Двоичная | Восьмеричная | Двоичная |
|---|---|---|---|
| 0 | 000 | 4 | 100 |
| 1 | 001 | 5 | 101 |
| 2 | 010 | 6 | 110 |
| 3 | 011 | 7 | 111 |
Перевод из двоичной в восьмеричную: разбиваем число на триады справа налево и заменяем каждую на цифру. Переведём 11001000₂:
| Триада | 11 | 001 | 000 |
|---|---|---|---|
| Дополняем нулями слева | 011 | 001 | 000 |
| Восьмеричная цифра | 3 | 1 | 0 |
Получили 310₈. Обратный перевод ещё проще: каждую цифру разворачиваем в триаду. Например, 52₈ → 101 010 → 101010₂.
Самое известное применение восьмеричной системы — права доступа в 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.
| Десятичная | Двоичная | Шестнадцатеричная |
|---|---|---|
| 0 | 0000 | 0 |
| 5 | 0101 | 5 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
Перевод в десятичную и обратно
Работает та же развёрнутая форма. Переведём 2F₁₆: 2 × 16 + 15 = 47₁₀. Покрупнее: 1A3₁₆ = 1 × 256 + 10 × 16 + 3 = 256 + 160 + 3 = 419₁₀.
Обратно — делением на 16. Переведём 419:
| Деление | Частное | Остаток | Цифра |
|---|---|---|---|
| 419 ÷ 16 | 26 | 3 | 3 |
| 26 ÷ 16 | 1 | 10 | A |
| 1 ÷ 16 | 0 | 1 | 1 |
Читаем снизу вверх: 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).
Сравним все четыре системы
| Десятичная | Двоичная | Восьмеричная | Шестнадцатеричная |
|---|---|---|---|
| 8 | 1000 | 10 | 8 |
| 13 | 1101 | 15 | D |
| 64 | 1000000 | 100 | 40 |
| 255 | 11111111 | 377 | FF |
| 419 | 110100011 | 643 | 1A3 |
Что мы узнали
- Восьмеричная (основание 8) и шестнадцатеричная (основание 16) системы — компактная запись двоичных данных.
- Одна восьмеричная цифра равна трём двоичным разрядам, одна шестнадцатеричная — четырём.
- Перевод между этими системами и двоичной делается группировкой разрядов, без делений.
- В шестнадцатеричной системе цифры 10–15 записываются буквами A–F; один байт — это две hex-цифры.
- Префиксы
0x,0oи0bуказывают систему счисления в коде.