簡體   English   中英

負整數的位移?

[英]Bit shifting of negative integer?

我試圖理解負整數上的位移操作>>

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

有人能解釋一下這是怎么做到的嗎? 我知道它與Two的補碼有關,但我無法將其與轉換操作聯系起來。

這里提供完整的解釋

負整數的二進制補碼二進制:

負數用前導零而不是前導零寫。 因此,如果您的二進制補碼數僅使用8位,則將“00000000”到“01111111”的模式視為0到127之間的整數,並保留“1xxxxxxx”以寫入負數。 使用(x-1)的位模式寫入負數-x,其中所有位都被補充(從1切換到0或0到1)。 因此-1是補碼(1-1)=補碼(0)=“11111111”,-10是補碼(10-1)=補碼(9)=補碼(“00001001”)=“11110110”。 這意味着負數一直下降到-128(“10000000”)。

當然,Python不使用8位數字。 它用於使用但是許多位是你的機器本機的,但由於那是非便攜式的,它最近已切換到使用INFINITE位數。 因此,數字-5由按位運算符處理,就好像它被寫為“... 1111111111111111111011”。

那么,移位運算符的解釋:

x >> y返回x,向右移動y位。 這與//'x by 2 ** y相同。

為了理解上述說明,您可以使用以下內容查看:

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

正如您所看到的,數字的兩個補碼將擴展符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM