<p>根据@Martijn的回答,我想你需要以下内容。这使用编码前导1的思想来区分前导零的可变长度之间的差异:</p>
<pre><code>import unittest
import itertools
def encode(bits):
'''Encode n bits to an integer using a leading 1 to mark the length of the bit stream.
Example: [0,0,0] == 0b1000 == 16
'''
# start with an initial 1.
# iteratively shift current value left and OR in new bit.
return reduce(lambda n,b: n << 1 | b,bits,1)
def decode(encoded):
'''Decode a positive integer into a list of 0/1 values.
The most significant bit marks the length and is removed.
Example: 137 = 0b10001001 = [0,0,0,1,0,0,1]
'''
if encoded < 1:
raise ValueError('encoded must be > 0')
return [1 if c=='1' else 0 for c in format(encoded,'b')][1:]
class Cases(unittest.TestCase):
def testEncodeZeros(self):
for i in xrange(100):
bits = [0]*i
self.assertEqual(encode(bits),2**i)
def testEncodeOnes(self):
for i in xrange(100):
bits = [1]*i
self.assertEqual(encode(bits),2**(i+1)-1)
def testDecodeZeros(self):
for i in xrange(100):
encoded = 2**i
self.assertEqual(decode(encoded),[0]*i)
def testDecodeOnes(self):
for i in xrange(100):
encoded = 2**(i+1)-1
self.assertEqual(decode(encoded),[1]*i)
def testEncodeDecode(self):
for n in xrange(10):
for bits in itertools.product([0,1],repeat=n):
self.assertEqual(decode(encode(bits)),list(bits))
def testDecodeZero(self):
self.assertRaises(ValueError,decode,0)
def testDecodeNegative(self):
self.assertRaises(ValueError,decode,-1)
if __name__ == '__main__':
unittest.main()
</code></pre>
<p>输出:</p>
^{pr2}$