C語言學習記錄16 位運算子分析

2021-09-24 23:02:16 字數 2302 閱讀 7730

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位相當於除以2n次方,但效率比數**算符高;

(嵌入式開發時,對效率要求高時)

程式分析:(交換兩個整型變數的值)

方法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編...