28

私はPythonでそのようなリストを持っています: [1,0,0,0,0,0,0,0]. 0b10000000 と入力したように整数に変換できますか (つまり、128 に変換します)。また、シーケンスを整数に変換する必要もあり[1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]ます (ここでは、0b1100000010000000、つまり 259 が返されます)。必要に応じて、リストの長さは常に 8 の倍数です。

4

6 に答える 6

58

ビットシフトを使用できます:

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

これは、ARS によって提案された「int キャスト」メソッド、または 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
于 2012-09-17T14:25:16.543 に答える
15

...またはbitstringモジュールを使用する

>>> from bitstring import BitArray
>>> bitlist=[1,0,0,0,0,0,0,0]
>>> b = BitArray(bitlist)
>>> b.uint
128
于 2012-09-17T14:33:45.207 に答える
7

もちろん、Martijn Pieters のソリューションの方が優れていますが、Martijn Pieters のソリューションよりもわずかに優れている方法を見つけました。私は実際に結果に少し驚いていますが、とにかく...

import timeit

bit_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 output

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

n = 1000000

t1 = 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)

結果:

mult and add method time is : 1.69138722958 
shifting method time is : 1.94066818592 
于 2012-09-17T21:18:24.627 に答える
7

このワンライナーを試してください:

int("".join(str(i) for i in my_list), 2)

速度/効率に関心がある場合は、Martijn Pieters のソリューションをご覧ください。

于 2012-09-17T14:25:39.750 に答える