[英]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.