注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境: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...