Системы счисления в информатике: виды и перевод чисел

Системы счисления в информатике: виды и перевод чисел Полезное

Система счисления — это набор правил, по которым числа записываются символами (цифрами) и по которым эта запись читается как конкретное значение. Одно и то же значение в разных системах выглядит по-разному: число «пять» — это 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.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)