How about this:
def bitfield(n): return [int(digit) for digit in bin(n)[2:]]
It gives you
>>> bitfield(123) [1, 1, 1, 1, 0, 1, 1] >>> bitfield(255) [1, 1, 1, 1, 1, 1, 1, 1] >>> bitfield(1234567) [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1]
This only works for positive integers.
EDIT:
Converting to int using int() is a bit overloaded here. This is much faster:
def bitfield(n): return [1 if digit=='1' else 0 for digit in bin(n)[2:]]
See timings:
>>> import timeit >>> timeit.timeit("[int(digit) for digit in bin(123)[2:]]") 7.895014818543946 >>> timeit.timeit("[123 >> i & 1 for i in range(7,-1,-1)]") 2.966295244250407 >>> timeit.timeit("[1 if digit=='1' else 0 for digit in bin(123)[2:]]") 1.7918431924733795
Tim pietzcker
source share