Что такое двоичная система счисления
Двоичная запись — это способ записывать числа, в котором есть только 2 цифры: 0 и 1. Основание системы — 2, поэтому каждая позиция числа в два раза «тяжелее» предыдущей.
В привычной десятичной записи цифр десять, и позиции весят 1, 10, 100, 1000. Число 345 значит «3 сотни, 4 десятка и 5 единиц». В двоичной всё так же, только вместо десятков — двойки. Число 101 в ней означает «одна четвёрка, ноль двоек и одна единица», то есть 5. Чтобы не перепутать, основание пишут маленьким индексом справа: 1012 = 510.
По федеральной образовательной программе основного общего образования двоичную систему изучают в 8 классе вместе с переменными и циклами, и ученик должен уметь переводить целые числа от 0 до 1024 в обе стороны[1]. Этого диапазона хватает, чтобы понять принцип: дальше числа просто становятся длиннее. Дробные и отрицательные двоичные числа в базовый курс по ФОП ООО не входят, поэтому ниже речь только о целых.
Разряды и степени двойки
Разряд двоичного числа — это его позиция; вес разряда равен степени двойки, начиная с 2⁰ = 1 справа. Каждый следующий разряд левее весит вдвое больше.
| Номер разряда (справа, с 0) | Степень | Вес |
| 0 | 2⁰ | 1 |
| 1 | 2¹ | 2 |
| 2 | 2² | 4 |
| 3 | 2³ | 8 |
| 4 | 2⁴ | 16 |
| 5 | 2⁵ | 32 |
| 6 | 2⁶ | 64 |
| 7 | 2⁷ | 128 |
| 8 | 2⁸ | 256 |
| 9 | 2⁹ | 512 |
| 10 | 2¹⁰ | 1024 |
Эту таблицу стоит выучить наизусть — хотя бы до 1024: без неё быстро перевести двоичное число не получится. Она нужна в обоих направлениях перевода, и с ней большинство школьных задач решается в уме. Полезное наблюдение: число, записанное одними единицами, на 1 меньше следующей степени двойки. Например, 11112 = 15, а 16 = 100002. Восемь единиц подряд дают 255 — самое большое число, которое помещается в 8 разрядов. Именно до 1024 доходит перевод в программе 8 класса по ФОП, так что больше степеней для уроков не нужно.
Как перевести двоичное число в десятичное
Чтобы перевести двоичное число в десятичное, подпишите над каждой цифрой вес разряда и сложите веса тех разрядов, где стоит 1. Нули можно пропускать, но только при сложении, а не при записи разрядов.
Переведём 10011012. Цифр семь, значит старший разряд весит 64. Подписываем веса справа налево: 1, 2, 4, 8, 16, 32, 64.
| Вес | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| Цифра | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
Складываем веса под единицами: 64 + 8 + 4 + 1 = 77. Значит, 10011012 = 7710. Проверить себя легко: последняя цифра 1 означает, что число нечётное, а 77 действительно нечётное. Если последняя цифра 0, число обязательно чётное — это быстрый способ поймать ошибку.
Перевод из десятичной в двоичную делением на 2
Чтобы перевести десятичное число в двоичное, делите его на 2 с остатком, пока частное не станет 0, а затем запишите остатки снизу вверх. Последний остаток — старшая цифра.
Переведём 100. Делим и записываем остаток каждого шага:
100 : 2 = 50, остаток 0
50 : 2 = 25, остаток 0
25 : 2 = 12, остаток 1
12 : 2 = 6, остаток 0
6 : 2 = 3, остаток 0
3 : 2 = 1, остаток 1
1 : 2 = 0, остаток 1
Читаем остатки снизу вверх: 1100100. Значит, 10010 = 11001002. Официальная документация Python описывает те же операции: // даёт целую часть, % — остаток. Самая частая ошибка — прочитать остатки сверху вниз и получить перевёрнутое число 0010011. Чтобы этого избежать, сразу проверяйте ответ обратным переводом: 64 + 32 + 4 = 100. Сходится.
Тот же алгоритм легко записать на Python. Программа повторяет деление в цикле и приклеивает остаток слева к строке-ответу:
n = int(input())
otvet = ""
if n == 0:
otvet = "0"
while n > 0:
otvet = str(n % 2) + otvet
n = n // 2
print(otvet)
Здесь n % 2 — остаток от деления на 2, а n // 2 — целая часть частного. Отдельная проверка нуля нужна, потому что для 0 цикл не выполнится ни разу и строка останется пустой. Как работают такие циклы, подробно объясняет урок о цикле while в Python.
Способ вычитания степеней
Если таблица степеней двойки выучена, перевод можно делать без деления: найдите самую большую степень, не превышающую число, вычтите её и повторяйте с остатком.
Переведём 45. Самая большая степень не больше 45 — это 32. Остаток 13. Дальше 16 не помещается, ставим 0; 8 помещается — остаток 5; 4 помещается — остаток 1; 2 не помещается — 0; 1 помещается — 0 в остатке. Собираем цифры по разрядам 32, 16, 8, 4, 2, 1: 1011012. Проверка: 32 + 8 + 4 + 1 = 45.
Этот способ быстрее для чисел до 1024 и хорошо тренирует таблицу степеней. Деление на 2 надёжнее для больших чисел, когда степени уже трудно держать в голове. Пробуйте оба и выбирайте тот, в котором меньше ошибаетесь. Исследования самопроверки показывают, что решать задачи без подсказки полезнее, чем перечитывать готовый разбор[4], поэтому переводите сами и только потом сверяйтесь с таблицей разрядов.
Тренажёр: 8 разрядов-кнопок
Тренажёр вверху страницы — это 8 кнопок-разрядов с весами от 128 до 1 и поле десятичного числа. Нажатие на кнопку включает или выключает разряд, а десятичное значение пересчитывается сразу.
- Режим «Переводить». Включайте кнопки и смотрите, какое число получается, или впишите десятичное число и посмотрите его двоичную запись.
- Режим «Тренировка». Тренажёр загадывает число, а вы собираете его из кнопок.
- Проверка закономерностей. Включите только самую правую кнопку и следите, как меняется чётность; включите все — получится 255.
Несколько минут тренировки в день полезнее, чем час перед контрольной: короткие повторения с промежутками закрепляют навык лучше одного длинного занятия[2]. Результаты сохраняются только в вашем браузере и видны на странице прогресса. Заменить объяснение учителя тренажёр не может: он не подскажет, почему вы ошиблись, а только покажет правильный ответ.
Функции bin и int в Python
В Python для перевода есть 2 встроенные функции: bin() превращает целое число в строку с двоичной записью, а int(строка, 2) делает обратный перевод.
print(bin(13))
print(int("1101", 2))
print(format(13, "b"))
print(format(5, "08b"))
0b1101
13
1101
00000101
Приставка 0b показывает, что дальше идёт запись по основанию 2. Если она мешает, используйте format(n, "b"), а "08b" дополнит число нулями слева до 8 цифр — как в тренажёре. Python понимает и запись прямо в коде: 0b101 — это то же самое, что 5. Все эти функции описаны в официальной документации Python[3], и они удобны для самопроверки после ручного перевода. На контрольной без компьютера они не помогут, поэтому рассчитывать только на них не стоит.
Зачем компьютеру двоичная система
Компьютер хранит всё в двоичном виде, потому что его элементам проще всего различать 2 состояния: есть сигнал или нет. Одна такая ячейка — бит, а 8 бит составляют 1 байт.
В одном байте помещается 256 разных значений — от 00000000 до 11111111, то есть от 0 до 255. Поэтому в тренажёре именно 8 кнопок. Буквы, цвета точек на экране, звук — всё это кодируется наборами битов. Ещё Сеймур Пейперт (Papert) в книге «Mindstorms» предлагал, чтобы ребёнок сам управлял компьютером и понимал его, а не просто пользовался готовыми программами[5]. Как именно, рассказано в статье о кодировании информации. А связь двоичных цифр с «истиной» и «ложью» разобрана в материале о логических операциях: там 1 и 0 превращаются в «да» и «нет».
Когда перевод в уме не поможет
Если число больше 1024 или нужно перевести десятки чисел подряд, ручной способ не подходит: выше риск ошибки, чем польза. Вот 4 таких случая.
- Число больше 1024 — например, 70 000. Удобнее деление столбиком на бумаге или
bin(). - Нужно перевести 50 чисел подряд. Здесь проще написать программу из 5–6 строк.
- Дробные числа вроде 0,5. Школьная программа 8 класса касается только целых, для дробей другой алгоритм.
- Отрицательные числа, например −7. Их хранение в компьютере устроено сложнее и в базовый курс не входит.
«В двоичной системе можно записать только маленькие числа». Это миф: любое целое число записывается двоичными цифрами, просто запись получается примерно в 3,3 раза длиннее десятичной.
«Двоичное число 10 — это десять». Это не подтверждается: 102 = 2. Без указания основания запись «10» понимают по-разному, поэтому индекс лучше писать всегда.
Чего делать нельзя
Нельзя читать остатки при делении на 2 сверху вниз — получится перевёрнутое число. Вот 6 ошибок, которых стоит избегать.
- Нельзя начинать нумерацию разрядов слева — самый правый разряд весит 1.
- Не следует пропускать нули в середине записи: 101 и 11 — разные числа.
- Не стоит писать двоичные числа без основания в тетради, если рядом есть десятичные.
- Нельзя использовать цифру 2 в двоичной записи — там есть только 0 и 1.
- Не стоит сдавать ответ без обратной проверки — она занимает полминуты.
- Не следует путать
int("1101")иint("1101", 2): первая запись даёт тысячу сто один.
Источники
[1] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[2] Cepeda N. J., Pashler H., Vul E., Wixted J. T., Rohrer D. Distributed practice in verbal recall tasks: A review and quantitative synthesis // Psychological Bulletin. 2006. Vol. 132, № 3. P. 354–380.
[3] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
[4] Roediger H. L., Karpicke J. D. Test-enhanced learning: Taking memory tests improves long-term retention // Psychological Science. 2006. Vol. 17, № 3. P. 249–255.
[5] Papert S. Mindstorms: Children, Computers, and Powerful Ideas. New York: Basic Books, 1980.
Вопросы и ответы
Как по записи из нулей и единиц понять чётность?
Посмотрите на последнюю цифру справа. Если там 0, число чётное, если 1 — нечётное, потому что только самая правая позиция весит нечётную единицу.
Как быстро умножить такое число на 2?
Допишите справа ноль: 101 превратится в 1010, то есть 5 станет 10. Это то же самое, что дописать ноль к десятичному числу при умножении на 10.
Сколько цифр будет в записи числа 1024?
Одиннадцать: единица и десять нулей, потому что 1024 — это 2 в десятой степени. А 1023 записывается десятью единицами.
Зачем учить ручной перевод, если есть bin()?
На контрольной компьютера нет, а главное — ручной перевод объясняет, как устроены разряды. Без этого непонятны биты, байты и кодирование.
Что значит приставка 0b?
Это пометка Python о том, что дальше идёт запись по основанию 2. Аналогично 0o означает восьмеричную, а 0x — шестнадцатеричную.
Как запомнить степени двойки?
Удваивайте вслух: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024. Через несколько дней тренировки ряд запоминается сам, как таблица умножения.