1. 程式人生 > >無符號位移和有符號位移

無符號位移和有符號位移

轉載:https://blog.csdn.net/BushQiang/article/details/79394211

           https://blog.csdn.net/qq_26129689/article/details/50640293

無符號位移(>>>、<<<)和有符號位移(>>、<<)

關於數的移位,特別需要注意:

1、正數,三碼(原始碼、反碼、補碼)相同,所以無論左移還是右移都是補0.(左移則表示放大2的N次方,右移表示縮小2的N次方)

2、負數的補碼就需要注意,左移在右邊補0,右移需要在左邊補1

     有一個很有趣的誤區是,認為符號位保持不變,僅僅移動資料位,這是不對的,因為無論資料位還是符號位,都是二進位制,在整體大遷移的過程中,符號位也是要跟隨潮流的。只不過,為了保證右移後,和原來的符號數一樣,因此,負數在右移時左邊補

計算機表示數字正負不是用+ -加減號來表示,而是用最高位數字來表示,0表示正,1表示負

1.有符號右移>>(若正數,高位補0,負數,高位補1)

正數:例如4>>2

首先寫出4的二進位制數,因為是正數所以最高位為0,也就是第一個

 0000 0100

右移兩位得到(高位補0)

 0000  0001

結果為:1,右移n位也就是4/(2^n)

 

負數:例如-4>>2(高位補1)

首先寫出-4的二進位制數原始碼,因為是負數所以最高位為1   (負數的原始碼是負數的絕對值)

1000 0100

然後寫出-4反碼:保證符號位不變,其餘位置取反

1111 1011(反碼)

最後寫出-4的補碼:在反碼的基礎上加1

1111 1100(補碼)

右移2位: 在高位補1

1111 1111

根據補碼寫出原碼才是我們所求的結果, 保留符號位,然後減1取反       (或按位取反再加上1

1111 1110(減1的結果)

1000 0001(取反的結果)

結果為:-1

 

2:無符號右移>>>(不論正負,高位均補0)  注意:無符號,所以都是當正數操作的

正數:例如4>>>2

與4>>2的運算相同,結果也為1

負數:例如-4>>>2

首先寫出-4的二進位制數,因為是負數所以最高位為1

1000 0100

然後寫出-4補碼:保證符號位不變,其餘位置取反加1(從右往左遇到第一個1,然後剩下的全部取反就是了)

1111 1100(補碼)

右移2位: 在高位補0

0011 1111

結果為:63