Перевод чисел между системами счисления
Программисту регулярно приходится «переключаться» между системами счисления: прочитать двоичную маску, записать цвет в шестнадцатеричном виде, разобрать восьмеричные права доступа. В этой статье разберём универсальные алгоритмы перевода чисел между любыми системами — по шагам и с таблицами.
Из любой системы в десятичную: развёрнутая форма
Любое число в позиционной системе с основанием b — это сумма цифр, умноженных на степени основания. Достаточно расписать эту сумму и посчитать её в привычной десятичной арифметике.
Переведём двоичное число 10110 в десятичную систему:
| Цифра | 1 | 0 | 1 | 1 | 0 |
|---|---|---|---|---|---|
| Степень основания | 2⁴ = 16 | 2³ = 8 | 2² = 4 | 2¹ = 2 | 2⁰ = 1 |
| Вклад | 16 | 0 | 4 | 2 | 0 |
Сумма: 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 в двоичную систему.
| Шаг | Деление | Частное | Остаток |
|---|---|---|---|
| 1 | 13 ÷ 2 | 6 | 1 |
| 2 | 6 ÷ 2 | 3 | 0 |
| 3 | 3 ÷ 2 | 1 | 1 |
| 4 | 1 ÷ 2 | 0 | 1 |
Остатки снизу вверх: 1101. Проверим развёрнутой формой: 8 + 4 + 0 + 1 = 13. Сходится.
Теперь то же число 13 — в восьмеричную систему: 13 ÷ 8 = 1, остаток 5; 1 ÷ 8 = 0, остаток 1. Читаем снизу вверх: 15₈. И в шестнадцатеричную: 13 меньше 16, поэтому это просто одна цифра — D.
Пример побольше: 156 в двоичную
| Деление | Частное | Остаток |
|---|---|---|
| 156 ÷ 2 | 78 | 0 |
| 78 ÷ 2 | 39 | 0 |
| 39 ÷ 2 | 19 | 1 |
| 19 ÷ 2 | 9 | 1 |
| 9 ÷ 2 | 4 | 1 |
| 4 ÷ 2 | 2 | 0 |
| 2 ÷ 2 | 1 | 0 |
| 1 ÷ 2 | 0 | 1 |
Ответ: 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) и нули в остальные:
| Степень | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| Цифра | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
Получаем 1001101₂. С практикой такой перевод делается в уме за несколько секунд.
Между «неудобными» системами — через десятичную
Чтобы перевести число, например, из троичной системы в семеричную, проще всего пройти через десятичную: сначала развёрнутой формой получить привычное число, потом делением с остатком записать его в новой системе.
Переведём 201₃ в семеричную систему. Шаг 1: 2 × 9 + 0 × 3 + 1 = 19. Шаг 2: 19 ÷ 7 = 2, остаток 5; 2 ÷ 7 = 0, остаток 2. Ответ: 25₇.
Для пар систем, где одно основание — степень другого (2 и 8, 2 и 16), существует способ быстрее: перевод группами разрядов. О нём — в следующей статье про восьмеричную и шестнадцатеричную системы.
Что мы узнали
- В десятичную систему число переводят развёрнутой формой: цифры умножают на степени основания и складывают.
- Из десятичной — делением на новое основание; остатки читают снизу вверх.
- Для двоичной системы работает быстрый приём: разложить число на сумму степеней двойки.
- Между двумя произвольными системами удобно переводить через десятичную «промежуточную».
- Результат всегда можно проверить обратным переводом — привычка, которая спасает от ошибок.