<p>自Python 3.2以来,就有了用于字节操作的内置函数:<a href="https://docs.python.org/3.4/library/stdtypes.html#int.to_bytes" rel="noreferrer">https://docs.python.org/3.4/library/stdtypes.html#int.to_bytes</a>。</p>
<p>通过组合到字节和从字节,可以得到</p>
<pre class="lang-py prettyprint-override"><code>def twos(val_str, bytes):
import sys
val = int(val_str, 2)
b = val.to_bytes(bytes, byteorder=sys.byteorder, signed=False)
return int.from_bytes(b, byteorder=sys.byteorder, signed=True)
</code></pre>
<p>检查:</p>
<pre class="lang-py prettyprint-override"><code>twos('11111111', 1) # gives -1
twos('01111111', 1) # gives 127
</code></pre>
<p>对于较旧版本的Python,travc的答案是好的,但如果希望使用整数而不是字符串,则它不适用于负值。对于f(f(val))==val的twos补码函数,每个val为:</p>
<pre class="lang-py prettyprint-override"><code>def twos_complement(val, nbits):
"""Compute the 2's complement of int value val"""
if val < 0:
val = (1 << nbits) + val
else:
if (val & (1 << (nbits - 1))) != 0:
# If sign bit is set.
# compute negative value.
val = val - (1 << nbits)
return val
</code></pre>