Шестнадцатеричная система счисления: язык программистов

Байт 01101110 прочитает не каждый программист, а вот 0x6E — почти любой. Шестнадцатеричная система (hex) — это не ещё одна «математика», а компактная стенограмма двоичной записи: она существует только для того, чтобы люди не путались в длинных строках из нулей и единиц. Разберёмся, почему одна hex-цифра — это ровно четыре бита и как переводить числа взглядом.

0x6 0xE 0110 1110 6 14 hex-цифра 4 бита (тетрада) десятичное 0110 1110 = 0x6E = 110
Одна hex-цифра кодирует ровно четыре бита — тетраду. Байт 01101110 — это две тетрады и две hex-цифры: 0x6E

Зачем нужна ещё одна система

Двоичная запись честна к железу, но тяжела для глаз: байт — восемь знаков, два байта — шестнадцать, и всё из 0 и 1. Десятичная запись компактна, но глуха к железу: чтобы понять, какие биты стоят в числе 254, придётся делить с остатком.

Шестнадцатеричная система — компромисс: 16 = 2⁴, поэтому каждая hex-цифра отображается на четыре бита разом, без вычислений. Перевод hex ↔ двоичная — это не арифметика, а перекодировка: взял тетраду, посмотрел в табличку из 16 строк.

Одна цифра — четыре бита

Цифры hex: 0–9 и буквы A–F (A = 10, B = 11, … F = 15). Шестнадцать значений — ровно столько, сколько в четырёх битах. Привычка к шестнадцати цифрам вырабатывается быстро:

Двоичная тетрадаHexДесятичное
000000
001133
011066
100088
1010A10
1111F15

Перевод на пальцах

Hex → двоичная. Разбейте число на цифры и замените каждую тетрадой: 0x6E → 6 = 0110, E = 1110 → 01101110. Никакого сложения.

Двоичная → hex. Разбейте биты на четвёрки справа (для байта — просто пополам) и замените каждую четвёрку цифрой: 10110011 → 1011 = B, 0011 = 3 → 0xB3.

Hex → десятичная. Вот тут уже арифметика: старшая цифра умножается на 16. 0x6E = 6·16 + 14 = 96 + 14 = 110. Для байта есть шпаргалка: старшая цифра — столько-то раз по 16, младшая — как есть.

0xFF, маски и цвета

Байт с восемью единицами, 11111111, — это 0xFF, то есть 255. В курсе этот байт встречается постоянно: маска RAM_SEL8 из статьи о шине — это 0xFF, когда RAM разрешено говорить, и 0x00, когда она молчит. Порты дисплея и геймпада — адреса 0xFA–0xFF из статьи про память и ввод-вывод.

Та же система за пределами схемотехники: цвета в вебе — это три байта в hex (#FF7A00 — оранжевый: красный FF, зелёный 7A, синий 00). Научившись читать hex, вы научились читать половину технической документации.

Потренируйтесь: конвертер систем счисления переводит двоичное, десятичное и шестнадцатеричное в обе стороны, включая дополнительный код для отрицательных чисел.

Проверь себя

Почему одна hex-цифра — это ровно четыре бита?

Потому что 16 = 2⁴: шестнадцать значений цифры совпадают с количеством комбинаций четырёх битов.

Переведите 0xA3 в двоичную запись.

A = 1010, 3 = 0011, значит 0xA3 = 10100011.

Чему равно 0xFF в десятичной системе и почему это важно для байта?

15·16 + 15 = 255. Это максимум байта: все восемь бит равны 1, «включены» все провода.

Попробовать в симуляторе →