位移運算符將資料視為二進制數,向左或向右移動指定位數。分為左移(<<)與右移(>>),皆為雙目運算子。第一運算元為被移位值,第二運算元為移動位數。
unsigned short a = 0x0111; // 二進位 0000 0001 0001 0001 a << 3 // 結果 0x0888 (0000 1000 1000 1000) a >> 4 // 結果 0x0011 (0000 0000 0001 0001)
short a = -4; // 二進位 1111 1111 1111 1100 (補碼) a << 3 // 結果 -32 (1111 1111 1110 0000) a >> 4 // 結果 -1 (1111 1111 1111 1111) 符號位延伸
int i = 0x40000000; i << 1 變為 0x80000000(-2147483648),再左移 1 位變為 0。int,i << 33 等同於 i << 1。GCC 會發出警告。int i = 0x80000000; i >> 1 結果為 0xC0000000,而非 0x40000000。| 運算符 | 作用 |
|---|---|
& | 位邏輯 AND |
| | 位邏輯 OR |
^ | 位邏輯 XOR |
~ | 位邏輯 NOT (取反) |
>> | 右移 |
<< | 左移 |
按位運算僅適用於字元與整數型別。須區分位運算(&, |)與邏輯運算(&&, ||)。
&)用途:清零特定位、保留特定位。例:a & 255 保留低 8 位。
9 & 5 = 1 (00001001 & 00000101 = 00000001)
|)用途:設定特定位為 1。例:9 | 5 = 13。
^)用途:翻轉特定位、交換兩變數值。例:9 ^ 5 = 12。
~)單目運算符,各位取反。~9 = 1111111111110110。
<<) 與右移 (>>)已於上文詳細說明。
// 取 a 的第 5 到第 8 位 (共 4 位)
unsigned a, b;
scanf("%u", &a);
b = (a >> 5) & 0xF; // 先右移 5 位,再用 0xF 保留低 4 位
printf("a=%u\tb=%u\n", a, b);
// 將兩字元合併為一整數 char a='a', b='b'; int p = (a << 8) | b; int c = (p & 0xFF00) >> 8; // 取高位元組 int d = p & 0xFF; // 取低位元組
進行位運算時,推薦使用十六進位常數(如 0x01, 0x80),提升可讀性。例如設定字元最高位為 1:a = a | 0x80;。