我在某处读到,当数字为负数时它们是不同的,但我做了一个快速测试,看起来它们是等效的,至少在Python中是这样?
for i in range(-1000, 1000):
assert(i >> 1 == i // 2)
assert(i << 1 == i * 2)
在 Python 中,处理有符号整数并使用右位移位 (>>) 或整数除法 (//) 除以 2 以及左位移位 (<<) or multiplication (*) to multiply by 2, they behave equivalently for most cases, including negative numbers.
您的测试证实了在 -1000 到 1000 范围内的这种等价性:
蟒蛇 复制代码 对于范围内的 i (-1000, 1000): 断言(i >> 1 == i // 2) 断言(我 << 1 == i * 2) This equality holds true because Python uses two's complement representation for signed integers. In two's complement, right shifting a negative number fills the vacated bits with the sign bit (1 for negative numbers), effectively preserving the sign and performing a division by 2. Left shifting a negative number also preserves its sign.
因此,在 Python 中,对于您测试的整数范围,移位和整数乘法/除法对于正数和负数都是等效的。但是,在处理非常大的数字或使用整数表示或算术规则可能不同的其他编程语言时要小心。