问题1:C语言中的位运算符如何使用?注意事项有哪些?
位运算符直接对bit位进行操作,其效率很高。
左移和右移注意点
----左操作数必须为整数类型
char和short被隐式转换为int后进行移位操作;
----右操作数的范围必须为:[0,31]
----左移运算符 << 将运算数的二进制位左移
规则:高位丢弃,低位补0
----右移运算符 >> 把运算数的二进制位右移
规则:高位补符号位,低位丢弃
例子分析:位运算符初探
#include <stdio.h>
int main()
{
printf("%d\n", 3 << 2);
printf("%d\n", 3 >> 1);
printf("%d\n", -1 >> 1);
printf("%d\n", 0x01 << 2 + 3);
printf("%d\n", 3 << -1); // oops!
return 0;
}
防错准则:
1、避免位运算符、逻辑运算符和数学运算符同时出现在一个表达式中;
2、当位运算符、逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达计算次序;
小技巧:
左移n位相当于乘以2的n次方,但效率比数学运算符高;
右移n位相当于除以2的n次方,但效率比数学运算符高;
例子:交换两个整型变量的值
#include <stdio.h>
#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; \
}
int main()
{
int a = 1;
int b = 2;
printf("a = %d\n", a);
printf("b = %d\n", b);
SWAP3(a ,b);
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
位运算与逻辑运算不同
----位运算没有短路原则,每个操作数都参与运算;
----位运算的结果为整数,而不是0或1;
----位运算优先级高于逻辑运算优先级
例子:混淆概念的判断条件
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
if( ++i | ++j & ++k )
{
printf("Run here...\n");
}
return 0;
}
总结:
1、位运算符只能用于整数类型;
2、左移和右移运算的右操作数范围必须为[0 , 31];
3、位运算没有短路原则,所有操作数均会求值;
4、位运算的效率高于四则运算和逻辑运算;
5、运算优先级:四则运算 > 位运算 > 逻辑运算;