Можно ли использовать функцию bin в Python для получения битового представления числа
Что проверяют
Знакомы ли вы со встроенными средствами работы с числами и замечаете ли подводные камни: отрицательные числа, префикс, фиксированную ширину. Следом обычно просят вывести число в дополнительном коде или посчитать единичные биты.
Как отвечать
Да, bin() возвращает строку с двоичной записью и префиксом 0b: bin(42) даёт '0b101010'. Функция принимает int и любой объект с методом __index__, в том числе bool. На float будет TypeError, автоматического преобразования нет.
Главное стоит сказать сразу: для отрицательных чисел bin() возвращает знак и модуль, а не дополнительный код. bin(-5) это '-0b101'. У целых в Python нет фиксированной разрядности, поэтому дополнительный код получают маской нужной ширины: bin(-5 & 0xFF) даёт '0b11111011', то есть восемь бит.
Для форматирования удобнее format() и f-строки:
- без префикса:
format(42, 'b')илиf"{42:b}"; - фиксированная ширина:
f"{5:08b}"даёт00000101; - префикс и ширина вместе:
f"{5:#010b}", ширина считается с учётом0b.
Смежные инструменты: int('101010', 2) для обратного перевода, x.bit_length() для числа значащих бит, x.bit_count() с Python 3.10 для подсчёта единиц. Битовое представление float получают через struct.pack('>d', x) или смотрят в шестнадцатеричном виде через x.hex().
Где спотыкаются
Отрезают префикс срезом [2:] и не проверяют отрицательные числа: bin(-5)[2:] даёт 'b101', строку с буквой внутри.
Пишут bin(x).lstrip('0b'). Метод удаляет любые символы из набора, а не префикс целиком, поэтому bin(0) превращается в пустую строку. Для префикса есть removeprefix('0b') с Python 3.9, но проще сразу писать format(x, 'b').
Считают единицы через bin(x).count('1') и называют это оптимальным. Работает, но строит промежуточную строку, а bit_count() обходится без неё. К тому же для отрицательных чисел оба способа считают биты модуля, а не дополнительного кода.