擅长:python、mysql、java
<p>由于从数字列表开始,您可能希望避免字符串操作。这里有两种方法:</p>
<ul>
<li><p>将原始列表分为8位块并计算每个字节的十进制值(假设位的数量是8的倍数);感谢<a href="https://stackoverflow.com/a/32284957/694360">Padraic Cunningham</a>用8个子元素的组来划分序列的好方法</p>
<pre><code>bits = [1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1,1,0,0,1,1,1]
[sum(b*2**x for b,x in zip(byte[::-1],range(8))) for byte in zip(*([iter(bits)]*8))]
</code></pre></li>
<li><p>使用<strong>位运算符</strong>(可能效率更高);如果位数不是8的倍数,则代码的工作方式就好像比特序列在左边填充了0</em>(左边的填充通常比右边的填充更有意义,因为<em>它保留了原始二进制数字序列的数值</p>
<pre><code>bits = [1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1,1,0,0,1,1,1]
n = sum(b*2**x for b,x in zip(bits[::-1],range(len(bits)))) # value of the binary number represented by 'bits'
# n = int(''.join(map(str,bits)),2) # another way of finding n by means of string manipulation
[(n>>(8*p))&255 for p in range(len(bits)//8-(len(bits)%8==0),-1,-1)]
</code></pre></li>
</ul>