Встроенная функция bin(): конвертация чисел в двоичный формат
Функция 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) # 4242 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_101101011_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)) # 0b11010b1101
Сравнение 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}") # 0b001010100b101010 101010 0b00101010 0b00101010