1. 程式人生 > >C++---之移位運算

C++---之移位運算

 移位運算包含“邏輯移位”(logical shift)和“算術移位”(arithmetic shift)。

       邏輯移位:移出去的位丟棄,空缺位(vacant bit)用 0 填充。

       算術移位:移出去的位丟棄,空缺位(vacant bit)用“符號位”來填充,所以一般用在右移運算中。


1、如果是無符號數,不管是左移還是右移都是“邏輯移位” 

2、在計算機中,數值是以補碼來表示和儲存的。所以移位運算都是在“補碼”上進行操作的。

原碼轉補碼 
正數的補碼與原碼相同。 
負數的補碼:符號位為1,其餘位是原碼按位取反(反碼),然後整個數加1。

補碼轉原碼 
補碼的符號位為0,正數的原碼=補碼 
補碼的符號位為1,負數的原碼=補碼的補碼。即符號位不變(1),其餘各位取反,再加1.

-5的原始碼: 
1000 0101 
補碼: 
1111 1011

按位右移: 
cout << (-5>>1) << endl; 
補碼左移:1111 1011 -> 1111 1101 
輸出原始碼,1111 1101的原碼為: 
1000 0011 (十進位制:-3)

按位左移: 
cout << (-5<<1) << endl; 
補碼左移:1111 1011 -> 1111 0110 
輸出原碼:1111 0110 -> 10001010 (十進位制:-10)