Перевод чисел между системами счисления

Программисту регулярно приходится «переключаться» между системами счисления: прочитать двоичную маску, записать цвет в шестнадцатеричном виде, разобрать восьмеричные права доступа. В этой статье разберём универсальные алгоритмы перевода чисел между любыми системами — по шагам и с таблицами.

Из любой системы в десятичную: развёрнутая форма

Любое число в позиционной системе с основанием b — это сумма цифр, умноженных на степени основания. Достаточно расписать эту сумму и посчитать её в привычной десятичной арифметике.

Переведём двоичное число 10110 в десятичную систему:

Цифра10110
Степень основания2⁴ = 162³ = 82² = 42¹ = 22⁰ = 1
Вклад160420

Сумма: 16 + 4 + 2 = 22. Значит, 10110₂ = 22₁₀.

Тот же приём работает для любого основания. Переведём шестнадцатеричное 2F: цифра F — это 15, поэтому 2 × 16 + 15 = 47. А восьмеричное 157 — это 1 × 64 + 5 × 8 + 7 = 64 + 40 + 7 = 111.

Маленький индекс после числа обозначает основание системы: 1101₂ — двоичная запись, 13₁₀ — десятичная. Без индекса запись 10 неоднозначна: это десять, два или шестнадцать — зависит от системы.

Из десятичной в любую: деление с остатком

Обратный перевод выполняется делением на основание новой системы. Алгоритм такой:

  • делим число на основание, записываем остаток;
  • частное снова делим на основание, записываем остаток;
  • повторяем, пока частное не станет нулём;
  • читаем остатки снизу вверх — это и есть ответ.

Классический пример: переведём 13 в двоичную систему.

ШагДелениеЧастноеОстаток
113 ÷ 261
26 ÷ 230
33 ÷ 211
41 ÷ 201

Остатки снизу вверх: 1101. Проверим развёрнутой формой: 8 + 4 + 0 + 1 = 13. Сходится.

Теперь то же число 13 — в восьмеричную систему: 13 ÷ 8 = 1, остаток 5; 1 ÷ 8 = 0, остаток 1. Читаем снизу вверх: 15₈. И в шестнадцатеричную: 13 меньше 16, поэтому это просто одна цифра — D.

Пример побольше: 156 в двоичную

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

Ответ: 10011100₂. Проверка: 128 + 16 + 8 + 4 = 156.

Быстрый способ: через степени двойки

Для двоичной системы есть приём без деления — «жадное» вычитание степеней двойки. Держим в голове ряд: 1, 2, 4, 8, 16, 32, 64, 128, 256…

Переведём 77. Какая наибольшая степень двойки помещается в 77? Это 64. Остаток: 77 − 64 = 13. В 13 помещается 8, остаётся 5. В 5 помещается 4, остаётся 1. И наконец 1. Итого: 77 = 64 + 8 + 4 + 1.

Теперь ставим единицы в позиции использованных степеней (64, 8, 4, 1) и нули в остальные:

Степень6432168421
Цифра1001101

Получаем 1001101₂. С практикой такой перевод делается в уме за несколько секунд.

Между «неудобными» системами — через десятичную

Чтобы перевести число, например, из троичной системы в семеричную, проще всего пройти через десятичную: сначала развёрнутой формой получить привычное число, потом делением с остатком записать его в новой системе.

Переведём 201₃ в семеричную систему. Шаг 1: 2 × 9 + 0 × 3 + 1 = 19. Шаг 2: 19 ÷ 7 = 2, остаток 5; 2 ÷ 7 = 0, остаток 2. Ответ: 25₇.

Для пар систем, где одно основание — степень другого (2 и 8, 2 и 16), существует способ быстрее: перевод группами разрядов. О нём — в следующей статье про восьмеричную и шестнадцатеричную системы.

Что мы узнали

  • В десятичную систему число переводят развёрнутой формой: цифры умножают на степени основания и складывают.
  • Из десятичной — делением на новое основание; остатки читают снизу вверх.
  • Для двоичной системы работает быстрый приём: разложить число на сумму степеней двойки.
  • Между двумя произвольными системами удобно переводить через десятичную «промежуточную».
  • Результат всегда можно проверить обратным переводом — привычка, которая спасает от ошибок.
Проверьте себя
1. Чему равно двоичное число 10110₂ в десятичной системе?
A18
B20
C22
D26
2. Каков первый шаг при переводе числа из десятичной системы в двоичную?
AУмножить число на 2 и записать произведение
BРазделить число на 2 и записать остаток
CВычесть наибольшую степень двойки, которая помещается
DЗаписать число в восьмеричной системе
3. Как перевести шестнадцатеричное число 2F₁₆ в десятичную?
A2 + 15 = 17
B2 × 16 + 15 = 47
C2 × 15 + 6 = 36
D2 × 16 + 6 = 38
4. Каков наиболее удобный способ перевода между двумя произвольными системами счисления (например, из троичной в семеричную)?
AПрямой перевод с помощью таблицы соответствий
BСначала перевести в двоичную, затем в целевую систему
CСначала перевести в десятичную, затем из десятичной в целевую
DУмножить число на отношение оснований
Поддержать проект