bin() в Python: двоичная запись целого числа
Функция bin() в Python переводит целое число в двоичную систему и возвращает строку с префиксом 0b, например bin(10) дает '0b1010'. В статье разобраны правила работы функции, способы убрать префикс и добавить ведущие нули, особенности отрицательных чисел, обратный перевод в десятичную систему и практические задачи с битами.

Содержание статьи
Синтаксис и результат
Функция встроенная, импорт не нужен. Она принимает один аргумент и возвращает строку.
bin(x)Аргумент x должен быть целым числом типа int или объектом, у которого определен метод __index__(). Результат всегда начинается с 0b: этот префикс показывает, что строка записана в двоичной системе, и в таком же виде двоичные числа пишутся прямо в коде.
print(bin(10)) # 0b1010
print(bin(255)) # 0b11111111
print(bin(0)) # 0b0
print(bin(True)) # 0b1, bool является подклассом int
print(0b1010) # 10, литерал в коде уже числоНазвание функции часто путают с двоичными файлами, но к ним она отношения не имеет: для чтения файлов в режиме "rb" есть отдельные приемы, описанные в статье о бинарных файлах.
Какие аргументы принимает bin
Дробные числа и строки функция не принимает. Вызов bin(3.5) завершится ошибкой TypeError: 'float' object cannot be interpreted as an integer. Если дробная часть не важна, число сначала приводят к целому через int() или round(). Строку с цифрами тоже нужно предварительно преобразовать: bin(int("42")).
Собственные классы и метод __index__
Объект своего класса можно передать в bin(), если в классе определен метод __index__(), возвращающий целое число. Этот же метод позволяет использовать объект как индекс списка и в функциях hex() и oct().
class Quantity:
apple = 1
orange = 2
grapes = 2
def __index__(self):
return self.apple + self.orange + self.grapes
print("Двоичный эквивалент:", bin(Quantity()))
# Двоичный эквивалент: 0b101Метод __int__() для bin() не подходит: функции нужен именно __index__(), который означает, что объект без потерь представляется целым числом.
Как убрать префикс 0b и добавить ведущие нули
Для вывода часто нужна чистая запись из нулей и единиц фиксированной длины. Есть три распространенных способа, и форматирование среди них самое гибкое.
n = 5
print(bin(n)[2:]) # 101, срез отрезает префикс
print(format(n, "b")) # 101
print(f"{n:08b}") # 00000101, ширина 8 с нулями
print(f"{n:#010b}") # 0b00000101, префикс входит в ширину
print(f"{1234567:_b}") # 1_0010_1101_0110_1000_0111Срез [2:] ломается на отрицательных числах: из '-0b101' получится 'b101'. Спецификатор b в f-строках и format() корректно обрабатывает знак, поэтому в коде лучше использовать его.
Отрицательные числа
Для отрицательного числа bin() просто ставит минус перед двоичной записью модуля: bin(-9) возвращает '-0b1001'. Это не дополнительный код, которым числа хранятся в процессоре. В Python целые числа не ограничены по размеру, поэтому фиксированной разрядности у них нет.
Чтобы увидеть представление в дополнительном коде, число накладывают на маску нужной разрядности через побитовое И:
x = -9
print(bin(x)) # -0b1001
print(bin(x & 0xFF)) # 0b11110111, 8 бит
print(f"{x & 0xFFFF:016b}") # 1111111111110111, 16 битОбратный перевод в десятичную систему
Двоичную строку переводят обратно функцией int() с основанием 2. Префикс 0b при этом допускается, а основание 0 заставляет Python определить систему по префиксу.
print(int("1011", 2)) # 11
print(int("0b1011", 2)) # 11
print(int("0b1011", 0)) # 11, система по префиксу
print(int("-101", 2)) # -5Для других систем есть родственные функции: oct() дает восьмеричную запись с префиксом 0o, а hex() шестнадцатеричную с 0x. Подробнее о типах чисел и их записи написано в статье о числах в Python.
| Система | Из числа в строку | Из строки в число |
|---|---|---|
| двоичная | bin(10) → '0b1010' | int('1010', 2) |
| восьмеричная | oct(10) → '0o12' | int('12', 8) |
| шестнадцатеричная | hex(10) → '0xa' | int('a', 16) |
Работа с битами на практике
Двоичная запись удобна для отладки побитовых операций: флагов, масок, прав доступа. У целых чисел есть методы bit_length(), возвращающий число значащих бит, и bit_count() (Python 3.10+), считающий единицы.
a, b = 0b1100, 0b1010
print(bin(a & b), bin(a | b), bin(a ^ b)) # 0b1000 0b1110 0b110
print(bin(5 << 2), bin(20 >> 1)) # 0b10100 0b1010
n = 42
print(n.bit_length(), n.bit_count()) # 6 3
print(bool(n & (1 << 3))) # True, бит 3 установленЧисло единиц в двоичной записи до Python 3.10 считали через bin(n).count("1"), и этот вариант до сих пор встречается в задачах. Проверка n & (n - 1) == 0 для положительного n показывает, является ли число степенью двойки.
Частые вопросы
Ответы на вопросы, которые часто возникают при использовании bin().
Как перевести дробное число в двоичную систему?
bin() работает только с целыми. Дробную часть переводят вручную умножением на 2, а внутреннее представление float в формате IEEE 754 можно получить через struct.pack(">d", x) и вывести байты в двоичном виде.
Как перевести число в двоичную систему без bin()?
Делить число на 2 и собирать остатки в обратном порядке: while n: digits.append(n % 2); n //= 2, затем развернуть список. Такой алгоритм часто требуют в учебных задачах.
Как получить список битов числа?
Используйте форматирование и генератор списка: [int(c) for c in f"{n:08b}"] вернет список из восьми нулей и единиц.
Почему bin(-5) не возвращает дополнительный код?
Целые числа в Python не имеют фиксированной разрядности, поэтому функция показывает знак и модуль. Для дополнительного кода нужной длины используйте маску: bin(-5 & 0xFF).