将-1表示为真实的二进制模式

时间:2019-03-07 05:32:09

标签: python-2.7

与python3相比,整数在python2中受限制

In [1]: bin(-1)
Out[1]: '-0b1'

-1' is represented as-0b1',

如何将“ -1”编码为像“ 11111111111111111 ......”这样的真实二进制模式?

1 个答案:

答案 0 :(得分:2)

为使二进制补码具有任何含义,整数必须为固定长度。 Python的整数不是,因此无法使用这种编码。

Numpy确实使用了这种编码。因此,

import numpy as np
bin(np.uint8(-1))
# => '0b11111111'
bin(np.uint32(-1))
# => '0b11111111111111111111111111111111'

但是,对于Python自己的整数,0b11111111始终是127,而不是-10b11111111111111111111111111111111始终是4294967295,而不是-1。由于Python整数仅受内存限制,因此任何数量的整数都只会产生一个正整数。

将Python整数强制为类似C的结构的另一种方法是struct,这一次没有外部库。例如

bin(struct.unpack('I', struct.pack('i', -1))[0]) # 32-bit
bin(struct.unpack('B', struct.pack('b', -1))[0]) # 8-bit

您是正确的,Python2整数是有限的,但是它们透明地扩展为long,而长度不是。 Python3没有这种划分。但是,我不知道这种情况会改变我在上面写的内容。