c語言中的位運算子
位運算子直接對bit位進行操作,其效率最高。(比四則運算高很多)
左移和右移注意點:
1)左運算元必須為整數型別;
char和short被隱式轉換為int後進行移位操作。
2)右運算元的範圍必須為:[0,31]
左移-1或者右移32結果不確定,因為標準c沒規定其行為,編譯器開發商定義。
3)左移運算子《將運算數的二進位制左移;
規則:高位丟棄,低位補0;
4)右移運算子》把運算數的二進位制位右移;
規則:高位,補符號位,低位丟棄;(高位補符號位)
右運算元為負數,如何操作?是否正確?取決於編譯器。
0x1<< 2 + 3的值會是什麼?
程式設計確認:
分析:b同學對了。左移-1和編譯器有關,gcc實則右移1位。vs為0,bcc為整數最小值。
防錯準則:
1)避免位運算子,邏輯運算子和數**算符同時出現在乙個表示式中;
2)當位運算子,邏輯運算子和數**算符需要同時參與運算時,盡量使用括號()來表達計算次序。
小技巧:
左移n位相當於乘以2的n次方,但效率比數**算符高;
2)右移n位相當於除以2的n次方,但效率比數**算符高;
(嵌入式開發時,對效率要求高時)
程式分析:(交換兩個整型變數的值)
方法1:中間變數
方法2: a = a+b;(存在溢位問題)
b = a-b;
a = a-b;
方法3:異或方法
主要的原理是:
(1
)乙個變數按位異或自己的結果為0
,即:a ^ a = 0
;(2
)乙個變數按位異或0
的結果為自己,即:a ^ 0 = a
;於是,在上面的三條語句中,語句1可以看做把變數a、b儲存到a的儲存空間中(當然這只是一種理解方式);語句2消去了b(原理1),於是剩下了a(原理2),賦值到b的儲存空間,此刻,b變數已經得到了a的值;語句3中,原本a變數儲存空間內已經同時儲存了a、b,此刻,b已經變成了a,所以兩個按位異或後,便消去了a(原理1),只剩下了b(原理2),將它賦值給a,至此,交換變數的過程結束。
位運算子與邏輯運算不同:
1)位運算沒有短路原則,每個運算元都參與運算;
2)位運算的結果為整數,而不是0或1;(邏輯運算只有真和假)
3)位運算優先順序高於邏輯運算優先順序;
小結:1)位運算子只能用於整數型別;
2)左移和右移運算子的右運算元範圍必須為[0,31];
3)位運算沒有短路原則,所有運算元均會求值;
4)位運算的效率高於四則運算和邏輯運算;
5)運算優先順序:四則運算》位運算》邏輯運算;
16 位運算子分析
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 位運算子分析 1 c語言中的位運算子 位運算子直接對bit位進行操作,其效率最高。2 左移和右移注意點 左運算元必須為整數型別 char 和 short被隱式轉換為int後...
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編...