Руководство по конвертации систем счисления: двоичная, шестнадцатеричная, восьмеричная
Если вы когда-нибудь смотрели на шестнадцатеричный код цвета вроде #1A2B3C или на Unix-права доступа chmod 755 и задавались вопросом, откуда берутся эти числа, — вы не одиноки. Системы счисления — одна из тех фундаментальных концепций, которые большинство разработчиков используют каждый день, не задумываясь, — пока не наступает момент, когда действительно нужно переводить числа из одной системы в другую.
Давайте разберёмся. В этом руководстве мы рассмотрим системы счисления, которые важны в программировании, научимся переводить числа между ними и узнаем, где каждая из них применяется на практике.
Что на самом деле означает «основание»?
Мы считаем в десятичной системе (основание 10), потому что у нас десять пальцев. Каждая позиция цифры представляет степень числа 10:
4 2 7
| | |
| | └── 7 × 10⁰ = 7
| └────── 2 × 10¹ = 20
└────────── 4 × 10² = 400
───
Итого = 427
Это позиционная запись. «Основание» (также называемое «базис» или «radix») указывает, сколько уникальных цифр существует в системе и на что умножается каждая позиция. В десятичной системе — цифры 0–9. В двоичной — 0–1. В шестнадцатеричной — 0–9 и A–F.
Принцип одинаков для всех систем счисления — меняется только количество доступных символов и множитель для каждой позиции.
Интересный факт: вавилоняне использовали шестидесятеричную систему счисления (основание 60). Именно поэтому в минуте 60 секунд, а в окружности 360 градусов.
Двоичная система (основание 2): язык аппаратного обеспечения
Почему компьютеры используют двоичную систему
Компьютеры работают на транзисторах, а у транзисторов есть два надёжных состояния: включён и выключен. Это идеально соответствует 1 и 0. Теоретически можно построить компьютер на основании 3, но различать три уровня напряжения сложнее и менее надёжно, чем различать два. Двоичная система побеждает благодаря своей простоте и устойчивости.
Чтение двоичных чисел
Двоичная система работает так же, как десятичная, но каждая позиция представляет степень числа 2:
1 0 1 1 0 1
| | | | | |
| | | | | └── 1 × 2⁰ = 1
| | | | └────── 0 × 2¹ = 0
| | | └────────── 1 × 2² = 4
| | └────────────── 1 × 2³ = 8
| └────────────────── 0 × 2⁴ = 0
└────────────────────── 1 × 2⁵ = 32
──
Итого = 45
Таким образом, 101101 в двоичной системе равно 45 в десятичной. Читайте справа налево, удваивая значение позиции каждый раз: 1, 2, 4, 8, 16, 32, 64, 128...
Биты, байты и не только
- Бит: одна двоичная цифра (0 или 1)
- Ниббл (полубайт): 4 бита (представляет одну шестнадцатеричную цифру, значения 0–15)
- Байт: 8 бит (значения 0–255)
- Килобайт: 1 024 байта (2¹⁰)
Один байт может представлять 256 различных значений, поэтому символы ASCII помещаются в один байт, а каналы цвета RGB принимают значения от 0 до 255.
Основы двоичной арифметики
Сложение в двоичной системе подчиняется тем же правилам, что и в десятичной, но перенос происходит при 2, а не при 10:
1 0 1 1 (11 в десятичной)
+ 0 1 1 0 ( 6 в десятичной)
─────────
1 0 0 0 1 (17 в десятичной)
Когда 1 + 1 = 10 в двоичной системе (точно так же как 9 + 1 = 10 в десятичной), вы записываете 0 и переносите 1.
Восьмеричная система (основание 8): система из прошлого
Краткая история
Восьмеричная система была популярна в 1960-х и 70-х годах на машинах вроде PDP-8, которые использовали 12-битные слова — удобно делящиеся на четыре группы по три бита. Каждая восьмеричная цифра соответствует ровно трём двоичным цифрам, что делает её удобным сокращением.
Где восьмеричная система используется сегодня
Самое распространённое место сегодня — права доступа в Unix. Когда вы вводите chmod 755 script.sh, каждая цифра — это восьмеричное число, представляющее права на чтение (4), запись (2) и выполнение (1):
7 = 4 + 2 + 1 = rwx (владелец: чтение, запись, выполнение)
5 = 4 + 0 + 1 = r-x (группа: чтение, выполнение)
5 = 4 + 0 + 1 = r-x (остальные: чтение, выполнение)
Восьмеричные числа в программировании записываются с префиксом 0o (или просто с ведущим 0 в языке C, что стало причиной множества ошибок):
const permissions = 0o755; // 493 in decimal
console.log(permissions.toString(8)); // "755"
Будьте осторожны в JavaScript и Python: ведущий ноль, например 0755, может быть интерпретирован как восьмеричное число в некоторых контекстах. Всегда используйте явный префикс 0o, чтобы избежать двусмысленности.
Шестнадцатеричная система (основание 16): любимая система разработчиков
Зачем нужна шестнадцатеричная система
Шестнадцатеричная система решает практическую проблему: двоичные числа быстро становятся длинными. Десятичное число 255 в двоичной записи — это 11111111, целых восемь цифр. В шестнадцатеричной системе это всего лишь FF. Каждая шестнадцатеричная цифра соответствует ровно четырём двоичным цифрам (нибблу), что делает конвертацию тривиальной, а числа — компактными.
Шестнадцатеричная система использует цифры 0–9 и буквы A–F:
| Decimal | Binary | Hex |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 15 | 1111 | F |
Шестнадцатеричная система в реальной жизни
Веб-цвета — самое наглядное применение шестнадцатеричной системы. #FF5733 разбирается так:
#FF5733
││││││
││││└┘── Blue: 0x33 = 51
││└┘──── Green: 0x57 = 87
└┘────── Red: 0xFF = 255
Адреса памяти в отладчиках отображаются в шестнадцатеричном виде: 0x7FFF5FBFFA10 читается гораздо проще, чем его десятичный эквивалент 140 734 799 804 944.
MAC-адреса используют шестнадцатеричные пары, разделённые двоеточиями: A4:83:E7:2B:00:1F.
Цвет в CSS: rgba(255, 87, 51, 1.0) и #FF5733 представляют один и тот же цвет — шестнадцатеричная запись просто компактнее.
Конвертация между системами счисления
Из десятичной в двоичную
Последовательно делите на 2 и собирайте остатки, читая их снизу вверх:
45 ÷ 2 = 22 remainder 1 ↑
22 ÷ 2 = 11 remainder 0 │
11 ÷ 2 = 5 remainder 1 │ Read upward:
5 ÷ 2 = 2 remainder 1 │ 101101
2 ÷ 2 = 1 remainder 0 │
1 ÷ 2 = 0 remainder 1 │
Результат: 45 в десятичной = 101101 в двоичной системе.
Из десятичной в шестнадцатеричную
Тот же подход, но деление на 16:
427 ÷ 16 = 26 remainder 11 (B) ↑
26 ÷ 16 = 1 remainder 10 (A) │ Read upward: 1AB
1 ÷ 16 = 0 remainder 1 │
Результат: 427 в десятичной = 1AB в шестнадцатеричной системе.
Из двоичной в шестнадцатеричную (самый простой способ)
Сгруппируйте двоичные цифры по четыре (справа налево) и переведите каждую группу:
Binary: 10 1101
Padded: 0010 1101
Groups: 2 D
Result: 0x2D
Проверка: 0x2D = 2×16 + 13 = 45 ✓
Из шестнадцатеричной в двоичную
Обратный процесс. Разверните каждую шестнадцатеричную цифру в четыре двоичных:
Hex: F A 3
Binary: 1111 1010 0011
Result: 111110100011
Совет: запомните двоичные представления для 0–F (их всего 16). Как только вы их выучите, конвертация между шестнадцатеричной и двоичной системами будет происходить мгновенно в уме. Начните со степеней двойки: 1=0001, 2=0010, 4=0100, 8=1000.
Запись чисел в разных системах счисления в языках программирования
Все основные языки имеют синтаксис для записи чисел в различных системах счисления:
// JavaScript
const binary = 0b101101; // 45
const octal = 0o55; // 45
const hex = 0x2D; // 45
const decimal = 45; // 45
(45).toString(2); // "101101"
(45).toString(8); // "55"
(45).toString(16); // "2d"
parseInt("101101", 2); // 45
parseInt("55", 8); // 45
parseInt("2D", 16); // 45
# Python
binary = 0b101101 # 45
octal = 0o55 # 45
hexval = 0x2D # 45
bin(45) # '0b101101'
oct(45) # '0o55'
hex(45) # '0x2d'
int("101101", 2) # 45
int("55", 8) # 45
int("2D", 16) # 45
// C / C++
int binary = 0b101101; // 45 (C23 / GCC extension)
int octal = 055; // 45 (leading zero = octal!)
int hex = 0x2D; // 45
Обратите внимание на подвох в C: ведущий 0 означает восьмеричную систему. Запись int x = 010; даёт вам 8, а не 10.
Практические примеры использования
Побитовые операции и флаги
const READ = 0x01;
const WRITE = 0x02;
const EXECUTE = 0x04;
const ADMIN = 0x08;
let permissions = READ | WRITE;
if (permissions & EXECUTE) { }
Отладка и инспекция памяти
Когда вы видите ошибку сегментации по адресу 0xDEADBEEF или инициализацию памяти значением 0xCAFEBABE, это шестнадцатеричные константы, выбранные специально потому, что их легко заметить в дампах памяти. Файлы классов Java начинаются с магического числа 0xCAFEBABE.
Сетевые протоколы
IPv6-адреса используют шестнадцатеричную запись: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. MAC-адреса, идентификаторы USB-устройств и UUID Bluetooth — все они используют шестнадцатеричную систему.
Попробуйте сами
Забудьте о ручных вычислениях. Наш конвертер систем счисления мгновенно выполняет преобразования между любыми основаниями. Всё работает прямо в вашем браузере — ничего не отправляется на сервер.
Это особенно полезно, когда нужно:
- Отлаживать шестнадцатеричные дампы памяти, переводя их в десятичную систему
- Вычислять права доступа Unix в двоичной/восьмеричной системе
- Проверять коды цветов, переключаясь между шестнадцатеричной системой и RGB
- Конвертировать между системами счисления, основания которых не являются степенями двойки
Дополнительные ресурсы
- Объяснение кодирования Base64 — Base64 использует другой подход (6-битные группы, сопоставленные с 64 символами) для представления двоичных данных в виде текста
- Сравнение алгоритмов хеширования — результаты хеширования обычно отображаются в шестнадцатеричной системе
- Конвертер систем счисления — мгновенная конвертация между любыми системами счисления прямо в браузере
🛠️ Попробуйте прямо сейчас: Конвертер систем счисления — переводите числа между двоичной, восьмеричной, десятичной, шестнадцатеричной и любой другой системой с основанием до 36. Полностью на стороне клиента, абсолютно бесплатно.