Bits list to integer in Python Bits list to integer in Python python python

Bits list to integer in Python


You can use bitshifting:

out = 0for bit in bitlist:    out = (out << 1) | bit

This easily beats the "int cast" method proposed by A. R. S., or the modified cast with lookup proposed by Steven Rumbalski:

>>> def intcaststr(bitlist):...     return int("".join(str(i) for i in bitlist), 2)... >>> def intcastlookup(bitlist):...     return int(''.join('01'[i] for i in bitlist), 2)... >>> def shifting(bitlist):...     out = 0...     for bit in bitlist:...         out = (out << 1) | bit...     return out... >>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcaststr as convert', number=100000)0.5659139156341553>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcastlookup as convert', number=100000)0.4642159938812256>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import shifting as convert', number=100000)0.1406559944152832


...or using the bitstring module

>>> from bitstring import BitArray>>> bitlist=[1,0,0,0,0,0,0,0]>>> b = BitArray(bitlist)>>> b.uint128


I came across a method that slightly outperforms Martijn Pieters solution, though his solution is prettier of course. I am actually a bit surprised by the results, but anyway...

import timeitbit_list = [1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]def mult_and_add(bit_list):    output = 0    for bit in bit_list:        output = output * 2 + bit    return outputdef shifting(bitlist):     out = 0     for bit in bitlist:         out = (out << 1) | bit     return outn = 1000000t1 = timeit.timeit('convert(bit_list)', 'from __main__ import mult_and_add as convert, bit_list', number=n)print "mult and add method time is : {} ".format(t1)t2 = timeit.timeit('convert(bit_list)', 'from __main__ import shifting as convert, bit_list', number=n)print "shifting method time is : {} ".format(t2)

Result:

mult and add method time is : 1.69138722958 shifting method time is : 1.94066818592