Python: уроки, справочник и задачи

bin() в Python: двоичная запись целого числа

Раздел: Функции Python · Обновлено 31.10.2026

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

bin() в Python: двоичная запись целого числа
Фото: Graph+sas / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Синтаксис и результат
  2. Какие аргументы принимает bin
    1. Собственные классы и метод __index__
  3. Как убрать префикс 0b и добавить ведущие нули
  4. Отрицательные числа
  5. Обратный перевод в десятичную систему
  6. Работа с битами на практике
  7. Частые вопросы
    1. Как перевести дробное число в двоичную систему?
    2. Как перевести число в двоичную систему без bin()?
    3. Как получить список битов числа?
    4. Почему bin(-5) не возвращает дополнительный код?

Синтаксис и результат

Функция встроенная, импорт не нужен. Она принимает один аргумент и возвращает строку.

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).