Система счисления — это набор правил, по которым числа записываются символами (цифрами) и по которым эта запись читается как конкретное значение. Одно и то же значение в разных системах выглядит по-разному: число «пять» — это 5 в десятичной, 101 в двоичной и 5 в шестнадцатеричной записи. Ниже разберем, какие системы бывают, чем отличаются позиционные системы от непозиционных и как переводить числа из одной системы в другую — с примерами и кодом.
Содержание
Позиционные и непозиционные системы
Все системы счисления делятся на две большие группы по одному признаку: влияет ли положение цифры на ее значение.
В позиционной системе значение цифры зависит от ее разряда (места в числе). В десятичном числе 453 цифра 4 означает 400 (сотни), 5 — это 50 (десятки), 3 — это 3 (единицы). Чем левее разряд, тем больше его вес.
В непозиционной системе значение символа не зависит от позиции. Классический пример — римские цифры: в записи XXX каждый X всегда означает 10, независимо от места. Такие системы неудобны для вычислений и в программировании не применяются.
Практически вся информатика построена на позиционных системах, поэтому дальше речь идет именно о них. У любой позиционной системы есть основание — количество разных цифр в ней. От основания и зависит, какая это система.
Основные системы счисления в информатике
В IT постоянно встречаются четыре системы. Десятичная привычна человеку, а остальные три удобны компьютеру и программисту.
Двоичная (основание 2) использует только 0 и 1. На этом уровне работает любое цифровое устройство: элемент памяти хранит одно из двух состояний, которые и обозначают ноль и единицу. Именно поэтому двоичная система — базовая для компьютеров.
Восьмеричная (основание 8) использует цифры от 0 до 7. Сейчас встречается реже, но живет, например, в правах доступа Unix (команда chmod 755).
Десятичная (основание 10) — та, что используется в обычной жизни, цифры от 0 до 9.
Шестнадцатеричная (основание 16) использует цифры 0-9 и буквы A-F, где A=10, B=11, C=12, D=13, E=14, F=15. Ее любят за компактность: один байт (8 бит) записывается ровно двумя символами. В таком виде задают цвета в вебе (#FF0000 — красный), адреса памяти и коды символов.
Таблица соответствия систем счисления
| Система | Основание | Допустимые цифры | Пример записи | Десятичный эквивалент |
|---|---|---|---|---|
| Двоичная | 2 | 0, 1 | 11111111 |
255 |
| Восьмеричная | 8 | 0-7 | 377 |
255 |
| Десятичная | 10 | 0-9 | 255 |
255 |
| Шестнадцатеричная | 16 | 0-9, A-F | FF |
255 |
Все четыре записи в правой части таблицы — это одно и то же число 255, записанное по-разному.
Как устроено позиционное число
Значение позиционного числа считается по одному правилу для любой системы: каждую цифру умножают на основание в степени, равной номеру разряда, и результаты складывают. Разряды нумеруются справа налево, начиная с нуля.
Десятичное 503 раскрывается так:
5·10² + 0·10¹ + 3·10⁰ = 500 + 0 + 3 = 503
Ровно тот же принцип — для двоичного 101₂, только основание не 10, а 2:
1·2² + 0·2¹ + 1·2⁰ = 4 + 0 + 1 = 5
И для восьмеричного 254₈:
2·8² + 5·8¹ + 4·8⁰ = 128 + 40 + 4 = 172
Понимание этой формулы — ключ ко всем переводам ниже: перевод в десятичную систему и есть подсчет такой суммы.
Перевод чисел из одной системы счисления в другую
Разберем три частых случая: в десятичную, из десятичной и быстрый перевод между двоичной, восьмеричной и шестнадцатеричной.
В десятичную систему
Раскрываем число по формуле разрядов (см. выше) и складываем. Например, шестнадцатеричное FF:
F·16¹ + F·16⁰ = 15·16 + 15·1 = 240 + 15 = 255
Из десятичной системы
Целую часть делят на основание новой системы с остатком, пока частное не станет нулем. Остатки, выписанные снизу вверх (от последнего к первому), и дают искомое число.
Переведем 25 в двоичную:
25 : 2 = 12, остаток 1
12 : 2 = 6, остаток 0
6 : 2 = 3, остаток 0
3 : 2 = 1, остаток 1
1 : 2 = 0, остаток 1
Читаем остатки снизу вверх: 11001₂. Проверка: 16 + 8 + 0 + 0 + 1 = 25. Верно.
Тот же способ переводит 255 в шестнадцатеричную: 255 : 16 = 15 (остаток 15 = F), затем 15 : 16 = 0 (остаток 15 = F), итог — FF.
Между двоичной, восьмеричной и шестнадцатеричной
Здесь работает короткий трюк: 8 = 2³, а 16 = 2⁴, поэтому цифры группируются без деления в столбик.
Двоичное в восьмеричное: разбиваем биты на группы по 3 справа налево (недостающее слева дополняем нулями) и заменяем каждую группу одной восьмеричной цифрой. Например, 11010₂:
11010 -> 011 010 -> 3 2 -> 32₈
Двоичное в шестнадцатеричное: то же самое, но группами по 4 бита. Например, 01001111₂:
01001111 -> 0100 1111 -> 4 F -> 4F₁₆
Проверка: 4F₁₆ = 4·16 + 15 = 79, а 01001111₂ = 64 + 8 + 4 + 2 + 1 = 79. Совпадает.
Переводы в коде: Python
В реальной работе переводы делают не в столбик, а средствами языка. В Python встроены функции для всех трех целевых систем:
n = 255
print(bin(n)) # 0b11111111
print(oct(n)) # 0o377
print(hex(n)) # 0xff
# Обратный перевод: строка + основание
print(int("11111111", 2)) # 255
print(int("377", 8)) # 255
print(int("ff", 16)) # 255
Префиксы 0b, 0o, 0x показывают систему записи; при обратном переводе функция int принимает и строчные, и заглавные буквы ("ff" и "FF" дадут одно и то же).
Частая ошибка: недопустимая цифра
Новички путают систему и указывают неверное основание. Двойки в двоичной записи не существует, и Python это не пропустит.
Неверно:
int("102", 2)
Фактический результат:
ValueError: invalid literal for int() with base 2: '102'
Исправление — взять правильное основание для этой записи (в двоичной допустимы только 0 и 1, а 102 — это, например, восьмеричное число):
print(int("102", 8)) # 66
print(int("101", 2)) # 5
Выводы
- Система счисления — это правила записи чисел цифрами; одно значение в разных системах выглядит по-разному, но остается тем же числом.
- В позиционных системах значение цифры зависит от разряда; непозиционные (римские цифры) в программировании не используются.
- В информатике ключевые системы — двоичная (основа железа), восьмеричная, десятичная и шестнадцатеричная (компактная запись байтов и цветов).
- Перевод в десятичную — это сумма «цифра умножить на основание в степени разряда»; перевод из десятичной — деление с остатком.
- Между двоичной, восьмеричной и шестнадцатеричной перевод делается группировкой битов (по 3 и по 4) без деления в столбик.
- На практике переводы удобнее делать функциями языка: в Python это
bin,oct,hexиint(строка, основание).
Где применяется / связь с практикой
Системы счисления — не только школьная тема, а рабочий инструмент программиста. Двоичный и шестнадцатеричный код встречается при работе с цветами и графикой, битовыми флагами, сетевыми адресами, кодировками символов и правами доступа к файлам. Без понимания, как число превращается в биты, тяжело разбираться в низкоуровневых деталях и отладке.
Освойте тему на практике
Если хочется освоить это на практике и научиться переводить числа не только руками, но и кодом, стоит начать с основ языка. На курсе Python Basic разбирают базовый синтаксис и работу с числами, где встроенные функции перевода между системами — одна из первых тем. Посмотреть формат занятий и задать вопросы преподавателю можно на бесплатных вебинарах Otus.
Смежные темы: Двоичная система счисления и бинарный код — что нужно знать новичку, Двоичная система в информатике и программировании, Системы счисления и их особенности.
FAQ
Почему компьютеры используют именно двоичную систему?
Электронной схеме проще всего надежно различать два состояния — есть сигнал или нет, что естественно соответствует единице и нулю. Системы с большим числом уровней сложнее и дороже в изготовлении, поэтому цифровую технику строят на двух состояниях.
Зачем нужна шестнадцатеричная система, если есть двоичная?
Она короче: один байт в двоичной записи — это восемь символов, а в шестнадцатеричной всего два. При этом перевод между ними тривиален (каждые 4 бита = 1 шестнадцатеричная цифра), поэтому ее удобно использовать для компактной записи двоичных данных.
Что такое основание системы счисления?
Это количество разных цифр, которыми в ней пользуются, и одновременно число, в степени которого считаются веса разрядов. У двоичной основание 2, у восьмеричной 8, у десятичной 10, у шестнадцатеричной 16.



