C语言中的位运算符
位运算符直接对bit位进行操作,其效率最高
位与&
注意:位与符号是一个&,两个&&是逻辑与。
1.位与操作的特点,只有1和1位与结果为1,其余全是0。
2.位与和逻辑与的区别:位与两个操作数按照二进制位批次对应位相与的,逻辑与两个
操纵数作为整体来相与的。
例1:0b1010 1010 & 0b1111 0000 = 0b1010 0000;
例2:0b1010 1010 && 0b1111 0000 = 1(只要不全为0,都为真)
位或|
注意:位或符号是一个|,两个||是逻辑或
1. 位或操作的特点是:只有两个0相位或才能得到0,只要有一个1个1结果就一定是1
2. 位或和逻辑或的区别:位或两个操作数按照二进制位批次对应位相或的,逻辑或两个操纵数作为整体来相或的。
例1:0b1010 1010 | 0b1111 0000 = 0b1111 1010;
例2:0b1010 1010 || 0b1111 0000 = 1(只要不全为0,都为真)
位取反~
注意:C语言中位取反是~,逻辑取反是!
1.按位取反是将操作数的二进制位逐个按位取反(1变成0,0变成1);而逻辑取反是真(在C语言中只要不是0的任何数都是真)变成假(在C语言中只有0是为假,负数也为真)
#include<stdio>
int main(void)
{
int a = 45;
int b,c;
b = ~a;
b= !a;
printf("b = %d\n",b);
printf("c = %d\n",a);
return 0;
}
输出结果
b = -46
c = 0
位异或^
- 位异或真值表:1^1 = 0, 0^0 = 0, 1^0 = 1, 0^1 = 1
- 位异或特点:两个数如果相等结果为0,不相等结果为1。
#include<stdio>
int main(void)
{
unsigned int a = 45,b = 23; //45 :10 1101, 23: 01 0111
unsigned int c;
c = a ^ b; //111010
printf("c = %d\n",c);
return 0;
}
输出结果
c = 58
左移<< 和 右移>>
- 左操作数必须为整数类型
- char和short被隐式转换为int后进行移位操作
- 右操作数的范围必须为:[0, 31]
- 左移运算符 << 将运算数的二进制位左移
- 规则:高位丢弃,低位补0
- 右移运算符 >> 把运算数的二进制位右移
- 规则:高位补符号位,低位丢弃。
移位运算符的问题
0x1 << 2+3的值会是什么?原作者的本意究竟想表达什么?
防错准则
1. 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中
2. 当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量用括号()来表达计算次序
strong text小技巧
1. 左移n位相当于乘以2的n次方,但效率比数学运算符高
2. 右移n位相当于除以2的n次方,但效率比数学运算符高