Как переводить числа между системами счисления

Иван Корнев·11.04.2026·5 мин

Чтобы перевести число из десятичной системы в любую другую (двоичную, восьмеричную, шестнадцатеричную), нужно последовательно делить исходное число на основание новой системы и записывать остатки в обратном порядке. Для обратного перевода (из любой системы в десятичную) каждую цифру умножают на основание в степени её разряда и суммируют результаты. Эти два алгоритма являются базовыми для работы с данными в программировании и электронике.

Основные системы счисления

В информатике чаще всего используются четыре системы счисления. Их отличие заключается в основании — количестве уникальных цифр, используемых для записи чисел.

  • Десятичная (Decimal): Основание 10. Цифры: 0–9. Привычна для человека.
  • Двоичная (Binary): Основание 2. Цифры: 0, 1. Язык машинного кода.
  • Восьмеричная (Octal): Основание 8. Цифры: 0–7. Используется редко, иногда в правах доступа в Linux.
  • Шестнадцатеричная (Hexadecimal): Основание 16. Цифры: 0–9 и буквы A–F (где A=10, ..., F=15). Удобна для компактной записи байтов.

В шестнадцатеричной системе буквы обозначают числа от 10 до 15. Всегда используйте заглавные буквы (A-F) для избежания путаницы, особенно в коде.

Перевод из десятичной системы в другие (Метод деления)

Этот универсальный алгоритм позволяет получить запись числа в любой системе с основанием $B$.

Алгоритм:

  1. Разделите десятичное число на основание целевой системы ($B$).
  2. Запишите остаток от деления (это младший разряд).
  3. Возьмите полученное частное и повторите деление на $B$.
  4. Продолжайте процесс, пока частное не станет равным 0.
  5. Выпишите все остатки справа налево (от последнего к первому).

Пример: Перевод 156₁₀ в двоичную систему (B=2)

ДелениеЧастноеОстаток (цифра)
156 ÷ 2780
78 ÷ 2390
39 ÷ 2191
19 ÷ 291
9 ÷ 241
4 ÷ 220
2 ÷ 210
1 ÷ 201

Читаем остатки снизу вверх: 10011100₂.

Пример: Перевод 156₁₀ в шестнадцатеричную (B=16)

  1. $156 \div 16 = 9$, остаток 12 (в hex это буква C).
  2. $9 \div 16 = 0$, остаток 9.

Результат (снизу вверх): 9C₁₆.

Самая частая ошибка — записать остатки в порядке их получения (слева направо). Всегда начинайте чтение результата с последнего остатка.

Перевод из любой системы в десятичную (Метод степеней)

Чтобы понять, чему равно число в другой системе, нужно развернуть его по степеням основания. Формула для числа $d_n...d_1d_0$ в системе с основанием $B$:

$$N = d_n \cdot B^n + ... + d_1 \cdot B^1 + d_0 \cdot B^0$$

Где $d$ — цифра разряда, а степень $B$ зависит от позиции цифры (счет начинается с 0 справа).

Пример: 10011100₂ → десятичная Разряды справа налево имеют степени $2^0, 2^1, ..., 2^7$. $$1\cdot2^7 + 0\cdot2^6 + 0\cdot2^5 + 1\cdot2^4 + 1\cdot2^3 + 1\cdot2^2 + 0\cdot2^1 + 0\cdot2^0$$ $$= 128 + 0 + 0 + 16 + 8 + 4 + 0 + 0 = \mathbf{156}_{10}$$

Пример: 9C₁₆ → десятичная Здесь $C = 12$. $$9\cdot16^1 + 12\cdot16^0 = 144 + 12 = \mathbf{156}_{10}$$

Быстрый перевод между двоичной и шестнадцатеричной системами

Поскольку $16 = 2^4$, перевод между этими системами выполняется мгновенно через группировку битов. Не нужно использовать деление или умножение.

  1. Binary → Hex: Разбейте двоичное число на группы по 4 бита (тетрады), двигаясь справа налево. Замените каждую тетраду соответствующей hex-цифрой.
  2. Hex → Binary: Замените каждую шестнадцатеричную цифру на соответствующие ей 4 бита.

Таблица соответствия тетрад

Двоичное00000001001000110100010101100111
Hex01234567
Двоичное10001001101010111100110111101111
Hex89ABCDEF

Пример: Перевести 10011100₂ в hex.

  1. Делим на тетрады: 1001 и 1100.
  2. Смотрим в таблицу: 1001 = 9, 1100 = C.
  3. Результат: 9C.

Аналогично работает перевод в восьмеричную систему, но группы составляются по 3 бита.

Работа с дробными числами

Для перевода дробной части десятичного числа используется метод умножения.

Алгоритм (десятичная → другая):

  1. Умножьте дробную часть на основание новой системы ($B$).
  2. Целая часть произведения — это следующая цифра после запятой.
  3. Возьмите дробную часть результата и повторите умножение.
  4. Повторяйте, пока дробная часть не станет 0 или не будет достигнута нужная точность.

Пример: 0.625₁₀ → двоичная

  • $0.625 \times 2 = \mathbf{1}.25$ (цифра 1)
  • $0.25 \times 2 = \mathbf{0}.5$ (цифра 0)
  • $0.5 \times 2 = \mathbf{1}.0$ (цифра 1)
  • Дробная часть стала 0. Стоп.

Результат: 0.101₂.

Не все десятичные дроби точно переводятся в двоичные. Например, 0.1₁₀ в двоичной системе является бесконечной периодической дробью (0.000110011...). Это причина ошибок округления в финансовых вычислениях на компьютерах.

Частые ошибки

  • Путаница порядка битов: При переводе из десятичной системы остатки записываются в обратном порядке (последний остаток — старший разряд). При обратном переводе степени возрастают справа налево.
  • Игнорирование букв в Hex: Забывают, что после 9 идет A (10), а не 10 как две цифры. В одной ячейке может стоять только один символ.
  • Неверная группировка: При быстром переводе binary-hex начинают группировать биты слева направо. Группировать нужно строго справа налево от младшего разряда. Если битов не хватает до полной четверки/тройки слева, число дополняют нулями (например, 101 превращается в 0101).

FAQ

Как быстро перевести число в коде? В большинстве языков есть встроенные функции.

  • Python: bin(156)'0b10011100', hex(156)'0x9c', int('10011100', 2)156.
  • JavaScript: (156).toString(2), parseInt('10011100', 2).
  • Калькулятор Windows: Переключите режим в «Программист» (Programmer), введите число и выберите нужную систему (Bin, Oct, Dec, Hex).

Зачем нужны восьмеричная и шестнадцатеричная системы? Двоичная запись слишком длинная для человека (байт — это 8 символов). Шестнадцатеричная запись сжимает байт до двух символов, что удобно для чтения цветов (HTML/CSS), адресов памяти и машинных кодов. Восьмеричная исторически использовалась в архитектурах, где байт был не 8, а иначе кратен 3 битам, сейчас встречается реже.

Что такое дополнительный код? Для представления отрицательных чисел в компьютере используется специальный формат (дополнительный код). Чтобы получить -5 в 8-битном формате: берут 5 (00000101), инвертируют все биты (11111010) и прибавляют единицу (11111011). Прямой перевод знака минус в двоичную систему простым добавлением символа "-" в вычислительной технике не применяется.