按位异或 0xFFFFFFFF?

Bitwise xor 0xFFFFFFFF?

我无法解决这个问题:

def expr(a):
    return ~(a ^ 0xFFFFFFFF), a ^ 0xFFFFFFFF, ~a, a

print(expr(0xFFFFFFFF))
print(expr(1))
print(expr(0))  
print(expr(-1))

我理解 ~a 表示 a 的二进制补码,但 a ^ 0xFFFFFFFF 也会翻转所有位,但 python 会将其解释为一个大数。我知道 Python3 使用的是未绑定的整数大小,它是如何工作的?有人可以 ELI5(像我五岁一样解释)吗?

结果:

(         -1,           0, -4294967296, 4294967295)
(-4294967295,  4294967294,          -2,          1)
(-4294967296,  4294967295,          -1,          0)
( 4294967295, -4294967296,           0,         -1)

更新: 我想我的问题可以简化为:在 C 中,111...1 可以表示 -1,我明白了,因为它是 32 位的。在Python中,整数大小是无限的,-1如何用二进制表示? 111...1是一个很大的正整数,不是吗?

0xFFFFFFFF是一个大数;它是 232-1 的十六进制表示。 Python 的整数在内部表示为 C 长整数的链表,理论上允许无限大小。 Python 中的按位异或 (^) 对比您给出的位更重要的位使用零值,因此最终结果是只有较低的 32 位被翻转,导致行为与你在 C 中得到的,那里只有 32 位,最终结果是 'all' 位被翻转。

In Python, the integer size is unlimited, how do you represent -1 in binary? 111...1 is a large positive integer, no?

正数有无限的前导零序列。也就是说,如果我们需要表示数字 100101(等于 37),则等于 ...000100101,前面有任意多个零。没有计算机系统试图存储所有这些前导零,因为有无限多,但可能会存储一些前导零以将数字填充到 "reasonable" 大小,例如 32 或 64 位。

Python 将这个概念扩展到负数,说负数有无限多个前导 one。所以如果你需要表示 -37,那就是 ...111011011,前面有你需要的数量。同样,-1 就是 ...1111。因此,如果您将 -1 与另一个 Python 整数进行 XOR -1,它将翻转该数字的 所有 位,包括其前导零或一个(就像您使用波浪号运算符一样) .不幸的是,Python 没有 "infinite leading ones," 的方便的二进制符号,因此您不能将(例如)0b...111 写为整数文字;你必须使用 -1 代替,或者将其反转并写成 ~0b0.

虽然这听起来很荒谬,但实际上在数学上是合理的。在 2-adic numbers, these sequences with infinite leading ones are formally equivalent to the corresponding negative integers. If you prefer an approach more grounded in computer engineering, you might imagine that the Python integers automatically sign-extend 下,无论它们需要多宽(这或多或少是实际实现)。