Перевод чисел между системами счисления¶
Перевод чисел из одной системы счисления в другую — это процедура преобразования записи числа, выраженной в одной системе счисления (СС), в эквивалентную запись в другой СС при сохранении его значения. Наиболее часто требуется перевод между десятичной системой и позиционными системами с основаниями 2 (двоичная), 8 (восьмеричная) и 16 (шестнадцатеричная), которые широко используются в вычислительной технике и программировании.
¶Основы позиционных систем счисления
В позиционной системе счисления значение числа определяется не только цифрами, но и их положением (разрядом). Каждый разряд соответствует целой степени основания системы. Запись числа в системе с основанием $r$ имеет вид:
$$N = a_n r^n + a_{n-1} r^{n-1} + \dots + a_1 r^1 + a_0 r^0 + a_{-1} r^{-1} + a_{-2} r^{-2} + \dots$$
где $a_i$ — цифры, значения которых лежат в диапазоне от 0 до $r-1$. В десятичной системе основание равно 10, в двоичной — 2, в восьмеричной — 8, в шестнадцатеричной — 16. Для записи цифр со значениями 10–15 в шестнадцатеричной системе используются латинские буквы A, B, C, D, E, F.
¶Перевод из произвольной СС в десятичную
Наиболее универсальный метод — разложение числа по степеням основания. Для числа $a_n a_{n-1} \dots a_0.a_{-1} a_{-2} \dots$ в системе с основанием $r$ его десятичное значение вычисляется как сумма произведений каждой цифры на соответствующую степень основания.
Пример: перевести число 110111₂ в десятичную систему.
$$1 \cdot 2^5 + 1 \cdot 2^4 + 0 \cdot 2^3 + 1 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 = 32 + 16 + 0 + 4 + 2 + 1 = 55_{10}$$
Тот же подход работает для любой системы: число 2A7₁₆ равно $2 \cdot 16^2 + 10 \cdot 16^1 + 7 \cdot 16^0 = 512 + 160 + 7 = 679_{10}$.
¶Перевод из десятичной системы в произвольную
¶Целая часть числа
Целая часть переводится последовательным делением на основание целевой системы с записью остатков. Остатки берутся в обратном порядке — от последнего к первому.
Пример: перевести 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 |
Читая остатки снизу вверх: 156₁₀ = 10011100₂.
¶Дробная часть числа
Дробная часть переводится последовательным умножением на основание целевой системы. Целые части произведений берутся в прямом порядке до получения требуемой точности или до появления периодической последовательности.
Пример: перевести 0.625₁₀ в двоичную систему.
| Умножение | Результат | Целая часть |
|---|---|---|
| 0.625 × 2 | 1.25 | 1 |
| 0.25 × 2 | 0.5 | 0 |
| 0.5 × 2 | 1.0 | 1 |
Следовательно, 0.625₁₀ = 0.101₂.
¶Быстрый перевод между степенями двойки
Между двоичной, восьмеричной и шестнадцатеричной системами существует удобное соотношение, поскольку 8 = 2³ и 16 = 2⁴. Каждая цифра восьмеричного числа соответствует ровно трём двоичным цифрам, а каждая цифра шестнадцатеричного числа — четырём двоичным.
Перевод из двоичной в восьмеричную: двоичная запись разбивается на группы по три цифры справа налево (для целой части) и слева направо (для дробной), каждая группа заменяется соответствующей восьмеричной цифрой.
Пример: 10110101011₂ → 010 110 101 011 → 2653₈.
Перевод из двоичной в шестнадцатеричную аналогичен, но группы состоят из четырёх цифр: 10110101011₂ → 0101 1010 1011 → 5AB₁₆.
Обратные переводы выполняются заменой каждой цифры на соответствующую двоичную группу.
¶Перевод между произвольными СС
Прямой перевод между двумя произвольными системами обычно выполняется через десятичную систему как промежуточную: сначала число переводится в десятичную запись, затем — в целевую систему. Для систем, являющихся степенями одной и той же базы (например, 2, 4, 8, 16, 32), используется метод группировки разрядов, описанный выше.
¶Представление отрицательных чисел
В компьютерах отрицательные числа в двоичной системе часто представляются в дополнительном коде. Для получения дополнительного кода числа в системе с основанием $r$ из его прямого кода вычитается $r^n$, где $n$ — количество разрядов. В двоичной системе это соответствует инверсии всех бит с прибавлением единицы (дополнение до двойки). Такое представление позволяет выполнять сложение и вычитание одинаковой аппаратной арифметикой.
¶Периодические дроби
Дробная часть числа при переводе не всегда имеет конечную запись. Например, 0.1₁₀ в двоичной системе представляет собой периодическую дробь 0.0001100110011…₂ с периодом 0011. Это является причиной неточностей при хранении дробных чисел в компьютерах с плавающей запятой, поскольку двоичное представление десятичной дроби 0.1 не является конечным.
¶Автоматические средства перевода
Перевод между системами счисления поддерживается стандартными средствами: встроенные функции программных калькуляторов, функции bin(), oct(), hex() в Python, операторы форматирования в языках программирования, а также онлайн-калькуляторы и специализированные таблицы соответствий для часто используемых оснований.
¶Историческая справка
Позиционные системы счисления с разными основаниями использовались исторически: вавилоняне применяли шестидесятеричную систему (от которой произошли минуты и секунды), древние майя — двадцатеричную, а современная десятичная система закрепилась благодаря удобству счёта на пальцах. Двоичная система счисления была предложена Готфридом Лейбницем в начале XVIII века и получила широкое применение с развитием электронных вычислительных машин.
¶Источники
- Вичер С. П. «Основы программирования: системы счисления»
- Клайн М. «Математика. Поиск истины»
- Корн Корн. «Справочник по математике для научных работников и инженеров»
- Дональд Кнут. «Искусство программирования», том 2
