关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别
1. C语言中的位运算符
位运算符直接对bit
位进行操作,其效率最高。
2. 左移和右移注意点
- 左操作数必须为整数类型:
char
和short
被隐式转换为int
后进行移位操作 - 右操作数的范围必须为:[0, 31]的整数
- 左移运算符
<<
将运算数的二进制位左移:高位丢弃,低位补0 - 右移运算符
>>
把运算数的二进制位右移:高位补符号位,低位丢弃
3. 0x1 << 2 + 3
的值是什么?
#include <stdio.h>
int main()
{
printf("%d\n", 0x01 << 2 + 3);
return 0;
}
输出结果:
32
总结:四则运算的优先级高于位运算
4. 位运算防错准则
- 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中
- 当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号
()
来表达计算次序
小技巧:
- 左移n位相当于乘以2的n次方,但效率比数学运算高
- 右移n位相当于除以2的n次方,但效率比数学运算高
5. 不借助第三个变量交换两个整形变量的值(位运算实现)
#include <stdio.h>
// 通过异或运算来实现两个整形值的交换
#define SWAP(a, b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}
int main()
{
int i = 1;
int j = 2;
printf("i = %d, j = %d\n", i, j);
SWAP(i, j);
printf("i = %d, j = %d\n", i, j);
return 0;
}
6. 位运算符和逻辑运算符的区别
- 位运算没有短路规则, 每个操作数都参与运算
- 位运算的结果为整数,而不是0或1
- 位运算的优先级高于逻辑运算的优先级
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
if( ++i | ++j & ++k )
{
printf("Run here...\n");
}
printf("%d\n", i);
printf("%d\n", j);
printf("%d\n", k);
return 0;
}
输出结果:
Run here...
1
1
1
总结:注意区分逻辑运算的与或非运算和位运算中的与或非运算
7. 小结
- 位运算只能用于整形类型
- 左移和右移运算符的右操作范围必须在[0, 31]
- 位运算没有短路规则,所有操作数均会求值
- 位运算的效率高于四则运算和逻辑运算
- 运算优先级:四则运算 > 位运算 > 逻辑运算
声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!