C語言高階 16 位運算分析

2021-08-19 17:22:22 字數 1689 閱讀 8419

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 左移...