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

Двоичная система счисления и бинарный код: что нужно знать новичку Полезное

Двоичная система счисления — это позиционная система записи чисел с основанием 2, в которой используются всего две цифры: 0 и 1. Каждая позиция (разряд) весит вдвое больше соседней справа, а само значение цифры зависит от того, на каком месте она стоит. Именно так число представляют внутри компьютера.

Ниже разберу главное для новичка: как перевести число из десятичной системы в двоичную и обратно, что такое разряды и байт, как выполнять двоичную арифметику. Отдельно отделю двоичную систему счисления от бинарного кода — это близкие, но разные вещи, которые часто путают. Все переводы чисел я прогнал кодом, чтобы не ошибиться.

Двоичная система счисления и бинарный код: в чем разница

Эти два понятия стоит развести сразу, потому что их постоянно смешивают.

Двоичная система счисления — это способ записать число цифрами 0 и 1 по правилам позиционной арифметики. Здесь есть вес разряда, перенос, сложение и умножение — все как в привычной десятичной системе, только цифр две, а не десять.

Бинарный код (двоичное кодирование) — это соглашение, которое сопоставляет произвольному объекту (символу, цвету пикселя, команде процессора) некоторый номер, а затем записывает этот номер битами. Арифметического смысла у такого кода обычно нет: биты тут не «складывают», а читают по таблице соответствия.

Связь простая, ее удобно показать цепочкой на одном примере: символ A -> его номер в таблице ASCII (65) -> запись этого номера в двоичной системе (01000001). То есть двоичная система счисления — это инструмент, которым бинарный код записывает уже присвоенные номера. Дальше речь в основном о самой системе счисления, а про области применения кода есть отдельный разбор в смежных темах.

Разряды и вес позиции

Позиционная — значит, что вклад цифры в число зависит от ее места. В двоичной системе крайний правый разряд весит 1, следующий — 2, дальше 4, 8, 16 и так далее: каждый шаг влево удваивает вес. По-другому вес разряда с номером k (счет справа от нуля) равен 2 в степени k.

Возьмем двоичное число 1101 и распишем его по разрядам:

  • разряд 0 (справа): 1 весит 1
  • разряд 1: 0 весит 2
  • разряд 2: 1 весит 4
  • разряд 3: 1 весит 8

Складываем веса единиц: 8 + 4 + 0 + 1 = 13. Значит, двоичное 1101 равно десятичному 13. Ту же логику применяют к числу любой длины — просто разрядов больше.

Как перевести число из двоичной системы в десятичную

Алгоритм прямой: умножить каждую цифру на вес ее разряда и сложить результаты. Переведем 1101 обратно в десятичную:

1 · 8 + 1 · 4 + 0 · 2 + 1 · 1 = 8 + 4 + 0 + 1 = 13.

В Python это делает встроенная функция int со вторым аргументом — основанием системы:

print(int('1101', 2))      # разбираем двоичную запись
print(int('11001010', 2))  # число подлиннее

Вывод:

13
202

Функция int('1101', 2) читает строку как число в системе с основанием 2 и возвращает обычное десятичное целое. Проверять переводы так надежнее, чем считать в уме.

Как перевести число из десятичной системы в двоичную

Обратный перевод удобно делать делением на 2 с остатком. Делим число на 2, записываем остаток (0 или 1), результат снова делим на 2 — и так пока не дойдем до нуля. Затем читаем остатки снизу вверх. Разберем на числе 13:

  • 13 : 2 = 6, остаток 1
  • 6 : 2 = 3, остаток 0
  • 3 : 2 = 1, остаток 1
  • 1 : 2 = 0, остаток 1

Читаем остатки в обратном порядке (снизу вверх): 1101. Это и есть 13 в двоичной системе. В Python перевод в двоичную запись дает функция bin:

print(bin(13))   # приставка 0b - признак двоичной записи
print(bin(202))

Вывод:

0b1101
0b11001010

Приставка 0b в начале — это пометка Python, что дальше идет двоичная запись, а не десятичное число. Сами цифры после нее — результат перевода.

Бит и байт: сколько значений помещается

Один разряд двоичного числа называют битом (binary digit) — это минимальная единица информации, которая принимает значение 0 или 1. Одного бита мало, поэтому биты группируют.

Байт — это группа из 8 битов. Восемь разрядов дают 2 в степени 8 = 256 разных комбинаций, то есть один байт кодирует числа от 0 до 255 включительно. Этого хватает, например, чтобы задать яркость одного цветового канала пикселя или закодировать символ в однобайтовой кодировке.

Двоичные числа часто выравнивают до фиксированной ширины, дописывая нули слева. Для байта это 8 разрядов:

print(format(13, '08b'))   # число 13 в 8 разрядах
print(format(202, '08b'))  # число 202 в 8 разрядах

Вывод:

00001101
11001010

Спецификатор '08b' означает «двоичная запись, дополненная нулями слева до 8 знаков». Ведущие нули на значение не влияют, но делают запись ровной и наглядной. Дальше растут производные единицы: 1024 байта — это килобайт, 1024 килобайта — мегабайт и так далее.

Двоичная арифметика: сложение и умножение на 2

Считать в двоичной системе можно так же, как в десятичной, только перенос происходит уже при сумме 2, а не 10. Правила сложения битов короткие:

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 1 = 10 (пишем 0, единицу переносим в старший разряд)

Сложим 101 (это 5) и 011 (это 3). В младшем разряде 1 + 1 = 10: пишем 0, переносим 1. В следующем разряде 0 + 1 плюс перенос 1 снова дает 10: пишем 0, переносим 1. В старшем 1 + 0 плюс перенос 1 = 10. Итог — 1000, то есть 8. И действительно 5 + 3 = 8.

Умножение на 2 в двоичной системе — это сдвиг всех разрядов на одну позицию влево (справа дописывается 0), примерно как умножение на 10 в десятичной приписывает ноль. Проверим оба факта кодом:

a = 0b101   # 5
b = 0b011   # 3
print(a + b)        # обычное сложение
print(bin(a + b))   # тот же результат в двоичном виде
print(bin(a << 1))  # сдвиг влево на 1 разряд = умножение на 2

Вывод:

8
0b1000
0b1010

Запись 0b101 — это способ задать число сразу в двоичном виде прямо в коде: a равно 5. Оператор << сдвигает биты влево: a << 1 превращает 101 в 1010, то есть 5 становится 10. Важно не путать сдвиг с возведением в квадрат — сдвиг влево на n позиций умножает число на 2 в степени n, а не на само число.

От числа к бинарному коду символа

Теперь соберем цепочку из первого раздела на живом примере. Компьютер хранит текст не буквами, а номерами символов из таблицы кодировки. В таблице ASCII латинская буква A имеет номер 65. Чтобы записать этот номер битами, его переводят в двоичную систему и обычно выравнивают до байта:

print(ord('A'))                 # номер символа A в таблице
print(format(ord('A'), '08b'))  # этот номер в двоичном виде (1 байт)
print(chr(0b01000001))          # обратно из битов в символ

Вывод:

65
01000001
A

Функция ord возвращает номер символа, format(..., '08b') записывает его двоичными цифрами в байте, а chr делает обратное преобразование. Здесь и видно разницу: двоичная система счисления отвечает за запись номера (65 -> 01000001), а бинарный код (кодировка) — за то, какому символу этот номер присвоен. Поменяется таблица — поменяется и код символа, хотя арифметика двоичной записи останется прежней.

Где это пригодится на практике

Понимание двоичной системы — это база, на которую опираются битовые операции, работа с масками и флагами, разбор форматов данных, цветовые модели и низкоуровневая оптимизация. Даже на прикладном уровне удобно уметь быстро прикинуть, что значение помещается в один байт (0-255), или объяснить, откуда берется перенос при сложении.

Освойте тему на практике

Разобраться с числами, системами счисления и битовыми операциями на практике, а не только в теории, помогает курс Python-разработка с нуля: на нем отрабатывают работу с числовыми типами, функции bin, int, format и операторы сдвига.

Освойте тему на практике

Посмотреть, как преподаватели объясняют такие темы, и задать свои вопросы можно на открытых вебинарах Otus — они бесплатные и проходят регулярно.

Смежные темы: Все о системах счисления в информатике, Двоичный код: описание, особенности, области применения.

FAQ

Почему компьютеры используют именно двоичную систему, а не десятичную? Электронную схему проще и надежнее делать с двумя устойчивыми состояниями (есть сигнал или нет, заряжено или нет), чем с десятью разными уровнями. Два состояния естественно отображаются на 0 и 1, поэтому двоичная система удобнее для физической реализации.

Чем двоичная система отличается от шестнадцатеричной? Основанием: у двоичной оно равно 2 (цифры 0 и 1), у шестнадцатеричной — 16 (цифры 0-9 и буквы A-F). Шестнадцатеричная запись короче и часто используется как компактная форма для тех же двоичных данных: одна шестнадцатеричная цифра заменяет ровно 4 бита.

Как в двоичной системе записывают отрицательные числа? Знак не пишут отдельным минусом, а кодируют битами по специальному правилу — чаще всего это дополнительный код (two’s complement), где старший бит отвечает за знак. Это отдельная тема, выходящая за рамки записи обычных целых.

Выводы

  • Двоичная система счисления — позиционная запись чисел с основанием 2 и цифрами 0 и 1; вес разряда k равен 2 в степени k.
  • Перевод 2 -> 10: умножить цифры на веса разрядов и сложить (1101 = 8 + 4 + 1 = 13); в Python это int('1101', 2).
  • Перевод 10 -> 2: делить на 2 с остатком и читать остатки снизу вверх; в Python это bin(13) -> 0b1101.
  • Бит — один разряд (0 или 1), байт — 8 битов и 256 значений (0-255); выравнивание до байта дает format(n, '08b').
  • В арифметике перенос идет при сумме 2, а сдвиг влево на 1 разряд умножает число на 2.
  • Двоичная система счисления записывает числа, а бинарный код (кодировка) сопоставляет объектам номера, которые затем пишут в этой системе, — это разные уровни.
OTUS Журнал