Встроенная функция bin(): конвертация чисел в двоичный формат

Раздел: Основы Python -> Встроенные функции

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

print(bin(10))   # '0b1010'
print(bin(255))  # '0b11111111'
print(bin(0))    # '0b0'

Python max (функция max в python)

0b1010
0b11111111
0b0

функция bin python (встроенная функция bin() в python)

Функция принимает только целые числа. Передача числа с плавающей точкой или строки вызывает TypeError.

Типичная ошибка: попытка передать вещественное число.

bin(3.14)  # TypeError: 'float' object cannot be interpreted as an integer

Python id name (использование id() и name в python)

Варианты использования и сопутствующие вопросы

Как получить двоичную строку без префикса '0b'?

Для удаления префикса применяется срез [2:] или функция format() с спецификатором b.

num = 42
binary_str = bin(num)[2:]
print(binary_str)  # '101010'

# Альтернатива с format
binary_str2 = format(num, 'b')
print(binary_str2) # '101010'

команда open в python (команда open для открытия файлов в python)

101010
101010

Enumerate python (функция enumerate в python)

Проблема: при использовании среза с отрицательными числами префикс '0b' не отделяется от знака.

print(bin(-5)[2:])  # '-0b101'[2:] → '0b101'

функция sum в python (функция sum в python)

В таком случае лучше использовать format(num, 'b'), который возвращает строку с минусом: '-101'.

Как получить двоичное представление отрицательного числа в дополнительном коде?

Функция bin() для отрицательных чисел возвращает строку с минусом перед префиксом. Чтобы увидеть истинный двоичный код (дополнительный до N бит), нужно применить битовую маску.

mask = 0b11111111  # 8 бит
num = -5
binary_complement = bin(num & mask)
print(binary_complement)  # '0b11111011'

# Универсальный способ с указанием количества бит
def to_bin_complement(num, bits=8):
    mask = (1 << bits) - 1
    return bin(num & mask)[2:].zfill(bits)

print(to_bin_complement(-5, 8))  # '11111011'
print(to_bin_complement(-5, 16)) # '1111111111111011'

функция zip в python (функция zip в python)

0b11111011
11111011
1111111111111011

минимальное целое число python (минимальное целое число)

Распространенная ошибка: путаница между строкой, возвращаемой bin(-5) ('-0b101'), и настоящим дополнительным кодом. Для битовых масок требуется явное указание разрядности.

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

Использовать метод zfill() или спецификатор формата с шириной.

num = 5
# zfill
print(bin(num)[2:].zfill(8))  # '00000101'

# format с шириной
print(format(num, '08b'))     # '00000101'

# f-строка
print(f"{num:08b}")           # '00000101'
00000101
00000101
00000101

Проблема: при отрицательных числах zfill размещает нули после знака, что может быть нежелательно. Использовать format() или маску.

Как преобразовать двоичную строку обратно в целое число?

Используется функция int() с указанием основания 2.

binary_str = '101010'
num = int(binary_str, 2)
print(num)  # 42

# С префиксом 0b
num2 = int('0b101010', 0)  # или int('0b101010', 2)
print(num2)  # 42
42
42

Типичная ошибка: передача строки с ведущими нулями или пробелами. int() игнорирует пробелы, но не принимает недопустимые символы.

int(' 00101 ', 2)   # 5 – пробелы допустимы
int('1012', 2)      # ValueError: invalid literal for int() with base 2

Расширенные примеры использования

Комбинирование с побитовыми операторами

Результат побитовых операций можно сразу преобразовать в двоичную строку.

Пример
a = 0b1100
b = 0b1010
print(f"a & b = {bin(a & b)}")   # 0b1000
print(f"a | b = {bin(a | b)}")   # 0b1110
print(f"a ^ b = {bin(a ^ b)}")   # 0b0110 -> 0b110
print(f"~a    = {bin(~a)}")      # -0b1101 (в дополнительном коде 8 бит: 0b11110011)
a & b = 0b1000
a | b = 0b1110
a ^ b = 0b110
~a    = -0b1101

Для получения дополнительного кода отрицательного результата применяется маска.

Пример
mask = 0b11111111
print(bin(~a & mask))  # 0b11110011

Форматирование с f-строками и разделителями

Можно выводить двоичные числа с разделителями для удобства чтения.

Пример
value = 0b110110101
def format_bin(x, group=4):
    s = bin(x)[2:]
    # добавляем разделитель '_' каждые group разрядов с конца
    parts = []
    while s:
        parts.append(s[-group:])
        s = s[:-group]
    return '_'.join(reversed(parts))

print(format_bin(value))  # 1_1011_0101
print(format_bin(value, 8))  # 1_10110101
1_1011_0101
1_10110101

Создание таблицы двоичных представлений для диапазона чисел

Пример
print("Dec | Bin")
print("-" * 12)
for i in range(10):
    print(f"{i:3} | {bin(i):>8}")
Dec | Bin
------------
  0 |    0b0
  1 |    0b1
  2 |   0b10
  3 |   0b11
  4 |  0b100
  5 |  0b101
  6 |  0b110
  7 |  0b111
  8 | 0b1000
  9 | 0b1001

Использование с большими числами (long int)

Функция bin() работает с произвольно большими целыми числами, хотя вывод может быть длинным.

Пример
big_num = 12345678901234567890
binary_big = bin(big_num)
print(f"Длина двоичной строки: {len(binary_big)-2} бит")  # минус '0b'
print(binary_big[:50] + "...")  # первые 50 символов
Длина двоичной строки: 54 бит
0b101010110111000111100101101011000011111110010111101...

Применение в списочном выражении

Пример
nums = [0, 1, 2, 4, 8, 16]
bin_list = [bin(x) for x in nums]
print(bin_list)  # ['0b0', '0b1', '0b10', '0b100', '0b1000', '0b10000']
['0b0', '0b1', '0b10', '0b100', '0b1000', '0b10000']

Работа с пользовательскими классами через __index__

Если класс определяет метод __index__(), его экземпляры можно передавать в bin().

Пример
class CustomNumber:
    def __init__(self, val):
        self.val = val
    def __index__(self):
        return self.val

obj = CustomNumber(13)
print(bin(obj))  # 0b1101
0b1101

Сравнение bin(), format() и f-строк для разных задач

Пример
val = 42
# Только префикс '0b'
print(bin(val))           # 0b101010
# Только цифры (без префикса)
print(format(val, 'b'))   # 101010
# С префиксом и 8 бит
print(format(val, '#010b')) # 0b00101010  (префикс + ширина 10)
# f-строка с шириной
print(f"{val:#010b}")      # 0b00101010
0b101010
101010
0b00101010
0b00101010

Встроенная функция bin() в Python - comments

En
функция bin python (python)