&
按位与,对两个数的二进制的每一位,进行“并且”判断。
#include<stdio.h>
int main()
{
printf("%d\n",5 & 7);
return 0;
}
输出结果:5
因为
5的二进制是 0101;
7的二进制是 0111;
第一位和第三位都为1(真);
所以
5 & 7的二进制是 0101;5 & 7=5
————————————————————————
|
按位或,对两个数的二进制的每一位,进行“或者”判断。
#include<stdio.h>
int main()
{
printf("%d\n",6 | 11);
return 0;
}
输出结果:15
因为
6的二进制是 0110;
11的二进制是 1011;
对应位只要其中有一个是1就为真;
所以
6 | 11的二进制是 1111;6 | 11 =15
~
按位取反,对一个数的二进制的每一位取反。
#include<stdio.h>
int main()
{
printf("%d\n",~3);
return 0;
}
结果为:-4
因为
3 的二进制为:0000 0011;
全部取反后
~3的二进制为:1111 1100;
根据补码的知识可知-4的二进制为 1111 1100;
^
按位异或,对两个数的二进制的每一位,相同为0,不同为1.
#include<stdio.h>
int main()
{
printf("%d\n",4 ^ 7);
return 0;
}
输出结果为:3
因为
4 的二进制是 0100;
7 的二进制是 0111;
第一位和第二位都是不同,第三和第四位相同
4 ^ 7 的二进制为:0011
<< 和 >>
按位左移 和 按位右移,注意书写格式,要位移的量放在左边
算术右移:右边丢弃,左边补原符号位。
算术左移:左边丢弃,右边补零。
#include<stdio.h>
int main()
{
int a = 3;
printf("%d\n", a << 1);
return 0;
}
因为
3 的二进制位 0011;
3 << 1;的二进制是 0110;
如果是 3 >> 1.
#include<stdio.h>
int main()
{
int a = 3;
printf("%d\n", a >> 1);
return 0;
}
因为
3 的二进制位 0011;
3 >> 1;的二进制是 0001;
多余的数会被顶掉。
注意: 对于位移运算符,不要移动负数位,这是个标准未定义的。
例如:
int a = 10;
a >> -1//错误