C++---之移位運算
阿新 • • 發佈:2018-11-06
移位運算包含“邏輯移位”(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)