Мой подход:
def bits(number):
bit = 1
while number >= bit:
if number & bit:
yield bit
bit <<= 1
Не думаю, что для этого есть встроенная функция.
Мне также интересно, нет ли лучшего подхода к тому, что вы делаете. Есть хороший шанс, что вы действительно не хотите перебирать биты, подобные этой. Они могут быть намного лучше.
Из любопытства я проверил некоторые методы, опубликованные здесь, мои результаты:
Winston 2.35238099098
F.J. 6.21106815338
F.J. (2) 5.21456193924
Sven 2.90593099594
Duncan 2.33568000793
freegnu 4.67035484314
F.J. Преобразование в строку, я предполагаю, что вредит его производительности. Различные попытки оптимизации помогают, но недостаточно, Свен производит противоположность всем остальным, что может быть преимуществом, если вам это действительно нужно. Подход Дункана выигрывает по скорости (едва)
Снова с 340282366920938463463374607431768211457 вместо 109:
Winston 44.5073108673
F.J. 74.7332041264
Sven 47.6416211128
Duncan 2.58612513542
Отлично, Дункан! Следует отметить, что это в значительной степени лучший вариант для метода Дункана, поэтому он не всегда будет иметь столь существенное преимущество.