c語言中的位運算子:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
位運算子直接對bit位進行操作,其效率極高。
左移和右移注意點:
左運算元必須為整數型別,char和short會被隱式型別轉換為int後進行移位操作。
右運算元的範圍必須為:[0,31]。
左移運算子: 《將運算數的二進位制位左移,規則:高位丟棄,低位補0;
右移運算子: >>把運算數的二進位制位右移,規則:高位補符號位,低位丟棄。
下面這行**該怎麼理解:
0x1 << 2 + 3 的值會是什麼?
編寫下面**來進行驗證:
#include int main()
在linux下使用gcc編譯執行後:
32
3 << 2 = 12
3 >> 1 = 1
3 << -1 = 1
-1 >> 1 =-1
說明位運算子的優先順序低於四則運算的優先順序。
對於左移-1的行為,不同的編譯器有不同的解釋。
防錯準則:
避免位運算子、邏輯運算子和數**算符同時出現在乙個表示式中。
當位運算子、邏輯運算子和數**算符需要同時參與運算時,盡量使用括號()來表達計算次序。
小技巧:
左移n位相當於乘以2的n次方,但效率比數**算符高;
右移n位相當於除以2的n次方,但效率比數**算符高。
討論:如何交換兩個整型變數的值:
#include #define swap1(a, b) \
#define swap2(a, b) \
//可能會出現溢位
#define swap3(a, b) \
int main()
位運算子與邏輯運算子不同:
位運算子沒有短路規則,每個運算元都參與運算。
位運算子的結果為整數,而不是0和1;
位運算優先順序高於邏輯運算優先順序。
觀察下面**,判斷輸出:
#include int main()
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
執行結果為:
a = 1
b = 1
c = 1
那麼如果是下面的**呢?將會輸出什麼?有什麼區別?
if( ++a || ++b && ++c )
依然會列印字串,但是a,b,c的值不同,並且如果沒有列印語句的話,將不會發現a,b,c值的變化。(短路規則)
小結:位運算子只能用於整數型別;
左移和右移運算子的右運算元範圍為[0,31];
位運算沒有短路規則,所以運算元均會求值;
位運算的效率高於四則運算和邏輯運算;
運算優先順序:四則運算 > 位運算 > 邏輯運算。
c語言深度剖析 16 位運算子分析
1.c語言中的位運算子 2.左移和右移注意點 3.有趣的問題 0x1 2 3 的值會是什麼?include include int main 4.小貼士 防錯準則5.程式設計實驗 include include 利用中間變數交換 define swap1 a,b 利用部分和來交換 define sw...
C 16 位運算子分析
位運算子直接對 bit 位進行操作,其效率最高 左運算元必需為整數型別 右運算元的範圍必需為 0,31 左移運算子 將運算子的二進位制位左移動 右移運算子 把運算子的二進位制位右移動 問題 下面的運算結果是什麼?0x1 2 3實驗 include int main 輸出 121 1 321 gcc編...
C語言學習記錄16 位運算子分析
c語言中的位運算子 位運算子直接對bit位進行操作,其效率最高。比四則運算高很多 左移和右移注意點 1 左運算元必須為整數型別 char和short被隱式轉換為int後進行移位操作。2 右運算元的範圍必須為 0,31 左移 1或者右移32結果不確定,因為標準c沒規定其行為,編譯器開發商定義。3 左移...