16 位運算子分析

2021-10-01 23:14:54 字數 2439 閱讀 8940

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:4.4.5

一、位運算子分析

1)c語言中的位運算子

位運算子直接對bit位進行操作,其效率最高。

2)左移和右移注意點

- 左運算元必須為整數型別

*char 和 short被隱式轉換為int後進行移位操作

- 右運算元的範圍必須為:[0,31]

- 左移運算子

*規則:高位丟棄,低位補0

- 右移運算子

>>把運算子的二進位制位右移

*規則:高位補符號位,低位丟棄

二、有趣的問題

1)0x1<<2 + 3的值會是什麼? 

分析:考察的是優先順序問題

a同學:先算0x1 << 2 再把中間結果為3,最終為7。

b同學:我覺得先算2 + 3,所以結果為32。

c同學:可以這麼混合計算嗎?

問題:

原作者的本意究竟想表達什麼?

例項分析

位運算子初探

16-1.c

#include int main()

操作:

1) gcc 16-1.c -o 16-1.out編譯正確,列印結果:

12

1

-132

分析:

數**算符優先順序高於邏輯運算子。

小貼士防錯準則:

- 避免位運算子,邏輯運算子和數**算符同時出現在乙個表示式中

- 當位運算子,邏輯運算子和數**算符需要同時參與運算時,盡量使用括號()來表達計算次序

小技巧:

左移n位相當於乘以2的n次方,但效率比數**算符高

右移n為相當於除以2的n次方,但效率比數**算符高

程式設計實驗

交換兩個整型變數的值

16-2.c

#include //只從ide中找標頭檔案

/*借助乙個變數為中間值,進行兩個數值交換

*/#define swap1(a,b) \

/*用加減方式進行資料交換(如果兩個整數都很大,這種方式會導致資料溢位)

*/#define swap2(a,b) \

/*異或方式進行兩個數值交換(位運算)

*/#define swap3(a,b) \

int main(int argc , char* ar**)

操作:

1) 使用swap1(a, b):gcc 16-2.c -o 16-2.out編譯正確,列印結果:

a = 1

b = 2

a = 2

b = 1

分析:

數值交換,用變數太普通了。

2) 使用swap2(a, b):gcc 16-2.c -o 16-2.out編譯正確,列印結果:

a = 1

b = 2

a = 2

b = 1

分析:

使用加減法,要考慮數值型別溢位問題,如果想加時,兩個數值過大,相加可能超過資料型別最大範圍。

3) 使用swap3(a, b):gcc 16-2.c -o 16-2.out編譯正確,列印結果:

a = 1

b = 2

a = 2

b = 1

分析:

使用異或沒有數值型別溢位現象。

三、位運算與邏輯運算

1)位運算與邏輯運算不同:

- 位運算沒有短路規則,每個運算元都參與運算

- 位運算的結果為整數,而不是0或1

- 位運算優先順序高於邏輯運算優先順序

例項分析

混淆概念的判斷條件

16-3.c

#include int main()

return 0;

}

操作:

1) gcc 16-3.c -o 16-3.out編譯問題,列印結果:

run here...
分析:

位運算沒有短路原則,前置++都是計算後才返回數值。

小結1.位運算子只能用於整數型別

2.左移和右移運算子的右運算元範圍必須為[0,31]

3.位運算沒有短路規則,所有運算元均會求值

4.位運算的效率高於四則運算和邏輯運算

5.運算優先順序:四則運算 > 位運算 > 邏輯運算

C 16 位運算子分析

位運算子直接對 bit 位進行操作,其效率最高 左運算元必需為整數型別 右運算元的範圍必需為 0,31 左移運算子 將運算子的二進位制位左移動 右移運算子 把運算子的二進位制位右移動 問題 下面的運算結果是什麼?0x1 2 3實驗 include int main 輸出 121 1 321 gcc編...

位運算子分析

注意按位運算子 和 與邏輯運算子 和 完全是兩碼事,別混淆了。結合律 a b c a b c a b c 交換律 a b b a 左移和右移 左移運算子 右移運算子 是雙目運算子。其功能把 左邊的運算數的各二進位全部右移若干位,右邊的數指定移動的位數。但注意 對於有符號數,當為正數時,最高位補0 而...

c語言深度剖析 16 位運算子分析

1.c語言中的位運算子 2.左移和右移注意點 3.有趣的問題 0x1 2 3 的值會是什麼?include include int main 4.小貼士 防錯準則5.程式設計實驗 include include 利用中間變數交換 define swap1 a,b 利用部分和來交換 define sw...