位運算符對bit位進行操作,效率最高
&按位與
| 按位或
^ 按位異或
~ 取反
<< 左移------>左移操作數必須爲整數類型,char和short被隱式轉化爲int後進行位操作
規則:高位丟棄,低位補0
左移n相當於乘以2的n次方,但效率比數學運算符高
>> 右移------->右操作數的範圍必須爲【0,31】
規則:高位補符號位,低位丟棄
右移相當於除以2的n次方,但效率比數學運算符高
printf("%d\n", 3 << 2); ----->12
printf("%d\n", 3 >> 1); ----->1
printf("%d\n", -1 >> 1); ----->-1
printf("%d\n", 0x01 << 2 + 3);----->32
printf("%d\n", 3 << -1); // oops!------>1
位運算與邏輯運算不同:
位運算沒有短路規則,每個操作數都參與運算
位運算的結果爲整數,而不是0或1
位運算優先級高於邏輯運算優先級(運算優先級:四則運算>位運算>邏輯運算)
例:(交換兩個參數的值的三種算法)
#define SWAP1(a, b) \
{ \
int t = a; \
a = b; \
b = t; \
}
#define SWAP2(a, b) \
{ \
a = a + b; \
b = a - b; \
a = a - b; \
}
#define SWAP3(a, b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}