正數負數的二進制位運算(左移 右移 無符號右移)

正數和負數需先轉換成相應的二進制,再進行移位運算.詳細舉例如下:
1、左移(向左移動,低位補0,沒有無符號左移,因爲左移不影響符號位):
(1)正數左移 2<<1

(a)2爲正數,其原碼反碼和補碼均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 <<1 = 00000000 00000000 00000000 00000100 = 4

(2)負數左移 -2<<1

(a)-2原碼 10000000 00000000 00000000 00000010
(b)-2反碼 11111111 11111111 11111111 11111101
(c)-2補碼 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 <<1 = 11111111 11111111 11111111 11111100
(e)11111111 11111111 11111111 11111100低位減1=11111111 11111111 11111111 11111011
(f)11111111 11111111 11111111 11111011取反=10000000 00000000 00000000 00000100= -4 

2、右移(符號位先跟着向右移動完之後,最高位再還原爲原符號位):
(1)正數右移 2>>1

(a)2爲正數,其原碼反碼和補碼均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 >>1 = 00000000 00000000 00000000 00000001 = 1

(2)負數右移 -2>>1

(a)-2原碼 10000000 00000000 00000000 00000010
(b)-2反碼 11111111 11111111 11111111 11111101
(c)-2補碼 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>1=11111111 11111111 11111111 11111111(負數,需轉換)
(e)11111111 11111111 11111111 11111111低位減1=11111111 11111111 11111111 11111110
(f)11111111 11111111 11111111 11111110取反=10000000 00000000 00000000 00000001= -1 

2、無符號右移(向右移動,高位補0,符號位也跟着移動,主要針對負數):
(1)正數無符號右移 2>>>1(由於右移不影響正數符號位,故與正數右移結果一致)
…省略,具體參考正數右移…
(2)負數無符號右移 -2>>>1

(a)-2原碼 10000000 00000000 00000000 00000010
(b)-2反碼 11111111 11111111 11111111 11111101
(c)-2補碼 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>>1 = 01111111 11111111 11111111 11111111(正數,不需轉換)
(e)01111111 11111111 11111111 11111111=2^0+2^1+2^2+...+2^30
(f)設s=2^0+2^1+2^2+...+2^30
    2s=2^1+2^1+2^2+...+2^30+2^31
   則2s-s=2^31-2^0=2^31-1=2,147,483,648 - 1 = 2,147,483,647
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章