Что это и зачем
N = dₖ·bᵏ + … + d₂·b² + d₁·b + d₀ = Σ dᵢ·bⁱ
b — основание системы, dᵢ — цифра i-го разряда
DEC (0–9) · HEX (0–F, префикс 0x) · BIN (0–1, 0b) · OCT (0–7)
Позиционная система счисления записывает число цифрами, а вес каждой цифры зависит от её позиции: крайняя правая стоит на весе b⁰ = 1, следующая — на весе b¹, дальше b², и так далее. Основание b показывает, сколько разных цифр в системе: десять в десятичной, шестнадцать в шестнадцатеричной, две в двоичной и восемь в восьмеричной. Само число от способа записи не меняется — меняется только его форма: 255, 0xFF, 0b11111111 и 0o377 обозначают одно и то же количество. Этот конвертер переводит целое число из выбранной системы сразу во все четыре.
В электронике и программировании микроконтроллеров каждая система удобна для своей задачи. Десятичная привычна человеку. Шестнадцатеричная компактно описывает содержимое регистров и адреса памяти: ровно две HEX-цифры укладываются в один байт (8 бит, диапазон 0x00…0xFF), а четыре — в 16-битное слово. Двоичная показывает каждый бит отдельно — это язык битовых масок, портов ввода-вывода и флагов состояния. В вебе тем же способом кодируют цвет: #RRGGBB — это три байта яркости красного, зелёного и синего. Восьмеричная сегодня встречается редко: в правах доступа Unix и в старом коде.
Как выполняется перевод
Перевод из десятичной системы в любую другую — это последовательное деление с остатком на основание: число делят на b, пока частное не обнулится, а остатки, выписанные снизу вверх, дают цифры результата. Для HEX остатки 10…15 заменяют буквами A…F. Обратный перевод, в десятичную, выполняется по формуле выше: каждую цифру умножают на основание в степени её позиции и всё складывают. Калькулятор делает ровно это, поэтому переключение системы ввода мгновенно пересчитывает все четыре строки вывода.
У двоичной, восьмеричной и шестнадцатеричной систем есть удобное родство: основания 2, 8 и 16 — это степени двойки, поэтому группы битов переводятся напрямую, без промежуточной десятичной. Одна HEX-цифра — это ровно 4 бита (полубайт), одна OCT-цифра — 3 бита. Например, 0b11110000 читается двумя группами по четыре: 1111 = F и 0000 = 0, то есть 0xF0. Ввод понимает необязательные префиксы 0x, 0b, 0o и проверяет набор допустимых цифр (в двоичной только 0 и 1, в восьмеричной 0–7). Переводятся только целые неотрицательные числа; верхний предел — 2⁵³ (9 007 199 254 740 991), это наибольшее точно представимое целое.
Справочные данные
Первые шестнадцать значений стоит помнить наизусть — это одна HEX-цифра (полубайт) и её вид в остальных системах (двоичный столбец приведён без ведущих нулей, ровно так, как выводит калькулятор):
| DEC | HEX | BIN | OCT |
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 2 | 10 | 2 |
| 3 | 3 | 11 | 3 |
| 4 | 4 | 100 | 4 |
| 5 | 5 | 101 | 5 |
| 6 | 6 | 110 | 6 |
| 7 | 7 | 111 | 7 |
| 8 | 8 | 1000 | 10 |
| 9 | 9 | 1001 | 11 |
| 10 | A | 1010 | 12 |
| 11 | B | 1011 | 13 |
| 12 | C | 1100 | 14 |
| 13 | D | 1101 | 15 |
| 14 | E | 1110 | 16 |
| 15 | F | 1111 | 17 |
| 16 | 10 | 10000 | 20 |
Стандартные разрядности регистров и их предельные значения (все биты установлены в единицу):
| Разрядность | Диапазон (DEC) | Максимум (HEX) |
| 4 бита (ниббл) | 0…15 | 0xF |
| 8 бит (байт) | 0…255 | 0xFF |
| 16 бит (слово) | 0…65 535 | 0xFFFF |
| 32 бита | 0…4 294 967 295 | 0xFFFFFFFF |
Где это нужно на практике
Шестнадцатеричные и двоичные числа сопровождают почти любую работу с железом. Значения счётных регистров при настройке таймеров и прескейлеров МК задают в HEX, а разрядность таймера для ШИМ-сигнала считают в битах. Код АЦП — это целое от 0 до 2ᴺ−1, которое естественно читать в двоичном виде, а его эффективную разрядность в битах оценивает расчёт SNR и ENOB. Обратную задачу решает R-2R ЦАП: он превращает двоичный код обратно в напряжение, где каждый бит имеет свой вес.
В цифровой связи всё измеряется битами: кадр UART состоит из старт-бита, битов данных и стоп-бита, отклонение частоты порта оценивает калькулятор ошибки бодрейта, а пропускную способность канала — расчёт битрейта потока. Битовый тайминг закладывают и в шине CAN. В обработке сигналов число отсчётов и частотных корзин БПФ — степени двойки, их считает разрешение БПФ.
Двоичный вид незаменим для битовых масок. Чтобы включить один бит регистра, его объединяют по ИЛИ с маской (например, третий бит — это 0b00000100, то есть 0x04), а чтобы сбросить — применяют И с инверсией маски. Проверка бита — это И с маской и сравнение с нулём. Сдвиг влево на один разряд (<<) умножает число на 2, сдвиг вправо (>>) делит на 2 — это прямое следствие позиционной записи с основанием 2. Именно поэтому регистры периферии в даташитах почти всегда расписаны по битам, а их адреса и значения приводят в HEX.
Частые ошибки
Самая частая путаница — набор цифр: в двоичной не бывает цифры 2, в восьмеричной — 8 и 9, поэтому «19» нельзя прочитать как двоичное или восьмеричное число. Вторая ловушка — ведущий ноль: в языке C запись 0377 означает восьмеричное 255, а не десятичное триста семьдесят семь, из-за чего битовые маски легко задать неверно. Третья — потерянные ведущие нули: 0b101 и 0b00000101 — это одно и то же число 5, но при работе с 8-битным регистром биты принято дополнять до полного байта. Наконец, помните про знак и предел: переводятся только целые неотрицательные числа, а всё, что больше 2⁵³, выходит за границу точной арифметики.
Пример
По умолчанию в поле стоит 255 в десятичной системе. Деление с остатком на 16 даёт 255 = 15·16 + 15 — две цифры F, то есть 0xFF. В двоичном виде это восемь единиц: 0b11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255. В восьмеричной 255 = 3·64 + 7·8 + 7 = 0o377. Проверка обратным переводом: 0xFF = 15·16 + 15 = 255. Число 255 — это максимум для одного байта: все восемь бит установлены в единицу.
См. также: конвертер величин · приставки СИ · все калькуляторы
|