Python3中64位二进制异或运算后结果变成32位的原因是什么?

null
Python3中64位二进制异或运算后结果变成32位的原因是什么?

5 回复

首先 python3 里应该没有 32 位、64 位整数,都叫整数:

In [169]: type(2 ** 64)
Out[169]: int

In [170]: type(2 ** 32)
Out[170]: int

另外,这个异或结果是 0,那是多少位的整数呢?

In [171]: (2 ** 64) ^ (2 ** 64)
Out[171]: 0


你遇到的问题很可能是因为在Python 3中,对整数进行按位异或(^)运算后,使用bin()函数或格式化输出时,默认会去掉高位的零,导致显示上看起来像是“变成了32位”。

Python 3的整数是任意精度的,运算本身不会丢失位数。关键在于你如何查看或输出结果。

举个例子:

a = 0xFFFFFFFFFFFFFFFF  # 64位全1
b = 0x123456789ABCDEF0
c = a ^ b

print("a (hex):", hex(a))
print("b (hex):", hex(b))
print("c (hex):", hex(c))  # 完整64位十六进制
print("c (bin):", bin(c))  # 二进制表示,高位0被省略
print("c (bin, 64位):", format(c, '064b'))  # 强制显示64位

输出会类似:

a (hex): 0xffffffffffffffff
b (hex): 0x123456789abcdef0
c (hex): 0xedcba9876543210f  # 仍然是64位
c (bin): 0b1110110111001011101010011000011101100101010000110010000100001111  # 高位0没了
c (bin, 64位): 1110110111001011101010011000011101100101010000110010000100001111  # 补全了64位

核心原因bin()返回的是字符串,它会自动去掉最高位之前的零,所以当结果的高32位都是0时,输出看起来就像是32位的。同样,hex()也有类似行为,但十六进制下更不明显。

总结:用format(value, '064b')来保证显示完整的64位。

我指的是二进制的位数,如一下两个 64 位二进制
hash1 = '0b0010000110100001101101010101111110001001100001101011111110101000’
hash2 = '0b0010000110101001101101010101111110101001100001101011101110101000’

In [51]: bin(int(hash1,2)^int(hash2,2))
Out[51]: ‘0b1000000000000000000000100000000000000000010000000000’ ##52 位

异或之后的位数不是 64 位了,不清楚中间的换算逻辑是怎样的

Python 没有位数的概念,只是省去了前面的 0 位,如果强制 64 位,可以用:(bin(int(hash1,2)^int(hash2,2))[2:]).zfill(64)

因为转换为文本输出的时候会把开头的 0 省略掉。你自己补回去就好了。

回到顶部