Двоичная, восьмеричная, десятичная и HEX: руководство по системам счисления
Почему компьютеры используют двоичную и шестнадцатеричную системы, как переводить числа и где каждая из них встречается в реальном коде.
Большинство разработчиков регулярно сталкиваются минимум с тремя системами счисления — просто не всегда задумываются об этом. Вводите номер порта (десятичная), смотрите на CSS-цвет (#FF5733 — это шестнадцатеричная), читаете адрес памяти в стектрейсе (снова hex). А при работе с правами доступа в Unix всплывает восьмеричная.
Конвертер систем счисления позволяет ввести число в любой системе и мгновенно увидеть остальные три — без ручных вычислений.
Почему компьютеры используют двоичную систему
Компьютеры хранят всё в виде последовательностей 0 и 1, потому что транзисторы имеют два устойчивых состояния: включено и выключено. Никакого «почти включено» на аппаратном уровне нет. Поэтому каждое число, каждый символ и каждый пиксель в конечном счёте живут в двоичной записи.
Один двоичный разряд — это бит. Восемь бит — байт. Байт хранит значения от 0 (00000000) до 255 (11111111).
Шестнадцатеричная: компактная версия двоичной
Двоичная запись быстро становится громоздкой. Число 255 в двоичной — это 11111111, восемь символов вместо трёх. Шестнадцатеричная система решает проблему, группируя четыре бита в один символ.
В hex используются цифры 0–9 и буквы A–F (A = 10, B = 11, …, F = 15). Один hex-символ — четыре бита. Два hex-символа — один байт. Поэтому 255 в шестнадцатеричной — это FF: намного короче и напрямую соответствует двоичной записи (F = 1111, F = 1111).
Hex повсюду в программировании:
- CSS-цвета:
#1A2B3C— каждая пара символов это один цветовой канал (красный, зелёный, синий), по байту на каждый - Адреса памяти:
0x7fff5fbff8a0— выводятся в hex, потому что короче и совпадают с границами байт - SHA-256 хеши: 64 hex-символа = 256 бит
- Коды ASCII и Unicode:
U+0041— это буква A
Восьмеричная: наследие chmod
Восьмеричная система (основание 8, цифры 0–7) была распространена до того, как hex вытеснил её почти везде. Главный её рудимент сегодня — права доступа в Unix.
Когда вы пишете chmod 755 script.sh, цифры — это восьмеричные числа. Каждая цифра представляет три бита: чтение, запись и выполнение:
- 7 = 111 в двоичной = чтение + запись + выполнение
- 5 = 101 в двоичной = чтение + выполнение (без записи)
- 4 = 100 в двоичной = только чтение
То есть 755 означает: владелец может всё, группа и остальные — читать и выполнять, но не писать. Три восьмеричных цифры, девять битов прав, одна команда.
Как переводить числа между системами
Алгоритм всегда одинаков: сначала привести к десятичной, потом перевести в целевую систему.
Двоичное 1101 → десятичное: идём справа налево, умножаем каждый бит на соответствующую степень двойки (2⁰, 2¹, 2², 2³):
- 1 × 1 = 1
- 0 × 2 = 0
- 1 × 4 = 4
- 1 × 8 = 8
- Итого: 13
Десятичное 13 → hex: делим на 16, берём остатки. 13 ÷ 16 = 0, остаток 13. Остаток 13 = D. Итак, 13 в десятичной — это D в hex.
Руками такое считать никто не будет. Конвертер систем счисления делает это мгновенно — введите число в любое поле, остальные обновятся сразу.
Где это реально пригождается
Несколько ситуаций, где переключение систем счисления важно на практике:
Битовые флаги. Если выставляете флаги в байте, двоичная запись делает позиции битов очевидными. 0b10110000 нагляднее, чем 176, когда важно понять, какие именно биты установлены.
Работа с цветами. #FF8800 легче корректировать по каналам, чем переводить в десятичную. FF — максимум, 88 — среднее значение, 00 — ноль. Сразу видно: красный на максимуме, зелёный — средний, синего нет.
IP-адреса и сети. CIDR-нотацию и маски подсетей проще понять, умея переводить числа между десятичной и двоичной системами.
Отладка сериализованных данных. Protocol Buffers, CBOR и другие бинарные форматы показывают сырые байты в hex в большинстве отладчиков. Если знаешь, что 0x01 — это просто 1, а 0xFF — 255, читать дампы становится быстрее.
Откройте Конвертер систем счисления, введите число в любой системе, которую знаете, — остальные появятся сразу. Никакой математики, никаких таблиц.