C語言筆記 第十六課 位運算子分析
阿新 • • 發佈:2018-12-12
第十六課 位運算子分析
C語言中的位運算子
位運算子直接對bit位進行操作,其效率最高
位運算子 | 操作 |
---|---|
& | 按位與 |
I | 按位或 |
^ | 按位異或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
異或運演算法則:相同為0,不同為1
位運算子分析
左移和右移注意點
左運算元必須為整數型別
char和short被隱式轉換為int後進行移位操作
右運算元的範圍必須為:[0,31]
左移運算子<<將運算數的二進位制位左移
規則:高位丟棄,低位補0
右移運算子>>把運算數的二進位制位右移
規則:高位補符號位,低位丟棄
有趣的問題
0x1<<2+3的值是什麼? 32
16-1 位運算子初探
#include <stdio.h> int main() { printf("%d\n", 3 << 2); // 11<<2 ==>1100==> 12 printf("%d\n", 3 >> 1); // 11>>1 ==>01 ==> 1 printf("%d\n", -1 >> 1); //-1 printf("%d\n", 0x01 << 2 + 3);//7?32?error? printf("%d\n", 3 << -1); // oops! return 0; }
左移在不同編譯器裡面的結果不同:
gcc VC bcc
小貼士:
犯錯準則:
避免位運算子,邏輯運算子和數學運算子同時出現在一個表示式中
當位運算子、邏輯運算子和數學運算子需要同時參與運算時,儘量使用()來表達計算次序
小技巧:
左移n位相當於乘以2的n次方,但效率比數學運算子高
右移n位相當於除以2的n次方,但效率比數學運算子高
16-2 交換兩個整型變數的值
int a = 1; int b = 2; #define SWAP3(a, b) \ { \ a = a ^ b; \ b = a ^ b; \ a = a ^ b; \ } 計算過程: a = 0001^0010 = 0011 b = 0011^0010 = 0001 = 1 a = 0011^0001 = 0010 = 2
位運算與邏輯運算子
位運算沒有短路規則,每個運算元都參與運算
位運算的結果為整數,而不是0或1
位運算的優先順序高於邏輯運算的優先順序
16-3 混淆概念的判斷條件(重要)
小結:
位運算子只能用於整數型別
左移和右移運算子的右運算元範圍必須為[0,31]
位運算沒有短路規則,所有運算元均會求值
位運算的效率高於四則運算和邏輯運算
運算優先順序:四則運算>位運算>邏輯運算