Открыть сервисСервис

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

Перевод чисел из одной системы счисления в другую — это процедура преобразования записи числа, выраженной в одной системе счисления (СС), в эквивалентную запись в другой СС при сохранении его значения. Наиболее часто требуется перевод между десятичной системой и позиционными системами с основаниями 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 ÷ 2780
78 ÷ 2390
39 ÷ 2191
19 ÷ 291
9 ÷ 241
4 ÷ 220
2 ÷ 210
1 ÷ 201

Читая остатки снизу вверх: 156₁₀ = 10011100₂.

Дробная часть числа

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

Пример: перевести 0.625₁₀ в двоичную систему.

УмножениеРезультатЦелая часть
0.625 × 21.251
0.25 × 20.50
0.5 × 21.01

Следовательно, 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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru