位运算符对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; \
}