1. 程式人生 > >C語言筆記 第十六課 位運算子分析

C語言筆記 第十六課 位運算子分析

第十六課 位運算子分析

C語言中的位運算子

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

位運算子 操作
& 按位與
I 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移

異或運演算法則:相同為0,不同為1

位運算子分析

左移和右移注意點

左運算元必須為整數型別
char和short被隱式轉換為int後進行移位操作
右運算元的範圍必須為:[0,31]
左移運算子<<將運算數的二進位制位左移
規則:高位丟棄,低位補0
右移運算子>>把運算數的二進位制位右移
規則:高位補符號位,低位丟棄

有趣的問題

0x1<<2+3的值是什麼? 32

16-1 位運算子初探

#include <stdio.h>
int main()
{
    printf("%d\n", 3 << 2); // 11<<2 ==>1100==> 12
    printf("%d\n", 3 >> 1); // 11>>1 ==>01 ==> 1
    printf("%d\n", -1 >> 1); //-1
    printf("%d\n", 0x01 << 2 + 3);//7?32?error? 
    printf("%d\n", 3 << -1); // oops!
    return 0;
}

左移在不同編譯器裡面的結果不同:
gcc VC bcc
在這裡插入圖片描述

小貼士:

犯錯準則:
避免位運算子,邏輯運算子和數學運算子同時出現在一個表示式中
當位運算子、邏輯運算子和數學運算子需要同時參與運算時,儘量使用()來表達計算次序

小技巧:

左移n位相當於乘以2的n次方,但效率比數學運算子高
右移n位相當於除以2的n次方,但效率比數學運算子高

16-2 交換兩個整型變數的值

int a = 1;
    int b = 2;
#define SWAP3(a, b)    \
{                    \
    a = a ^ b;         \
    b = a ^ b;         \
    a = a ^ b;         \
}
計算過程:
a = 0001^0010 = 0011
b = 0011^0010 = 0001 = 1     
a = 0011^0001 = 0010 = 2 

位運算與邏輯運算子

位運算沒有短路規則,每個運算元都參與運算
位運算的結果為整數,而不是0或1
位運算的優先順序高於邏輯運算的優先順序
16-3 混淆概念的判斷條件(重要)
小結:
位運算子只能用於整數型別
左移和右移運算子的右運算元範圍必須為[0,31]
位運算沒有短路規則,所有運算元均會求值
位運算的效率高於四則運算和邏輯運算
運算優先順序:四則運算>位運算>邏輯運算