左移運算:
一個數向左移動K位,會丟棄最高的K位,包括符號位。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a = 0x40000000;
a <<= 1;
cout << a;//輸出爲 -2147483648
return 0;
}
右移運算:
右移運算分爲邏輯右移和算術右移。邏輯右移是左端補k個0;算術右移是左端補k個最高有效位的值。
大部分編譯器都對有符號數使用算術右移;無符號數一定是邏輯右移。
Java裏,x>>k表示會將x算數右移k個位置,x>>>k表示對x做邏輯右移。
假定一個數據類型爲w位,若移動k >= w位,實際上移動的位數位 k mod w。
<<與>> 的優先級比+,-,*,/ 的優先級低,需要加上括號。
擴展一個數的位表示分爲無符號數的零擴展和補碼數的符號擴展。
無符號數的零擴展:
在開頭加零就行。
補碼數的符號擴展:
添加最高有效位的值。