我试图了解负整数上的位移操作>>

-2 >> 1 # -1
-3 >> 1 # -2
-5 >> 1 # -3
-7 >> 1 # -4

有人可以解释这是怎么做的吗?我知道这与Two的补码有关,但我不能与移位运算有关。

最佳答案

完整说明提供here



因此,移位运算符的解释为:



为了理解上面的解释,您可以使用以下内容进行检查:

def twos_comp(val, nbits):
    """Compute the 2's complement of int value val"""
    if val < 0:
        val = (1 << nbits) + val
    else:
        if (val & (1 << (nbits - 1))) != 0:
            # If sign bit is set.
            # compute negative value.
            val = val - (1 << nbits)
    return val

def foo(a,b):
    print("{0:b} >> {1:b} = {2:b} <==> {3:b} >> {4:b} = {5:b}".format(
        a,b,a>>b,
        twos_comp(a,8),b, twos_comp(a>>b,8)
    ))

foo(-2, 1)
foo(-3, 1)
foo(-5, 1)
foo(-7, 1)

哪个输出:
-10 >> 1 = -1 <==> 11111110 >> 1 = 11111111
-11 >> 1 = -10 <==> 11111101 >> 1 = 11111110
-101 >> 1 = -11 <==> 11111011 >> 1 = 11111101
-111 >> 1 = -100 <==> 11111001 >> 1 = 11111100

如您所见,数字的二进制补码将扩展符号。

关于python - 负整数的位移?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39549971/

10-12 18:33