#include "stdio.h"
int main(void)
{
char a;
char b;
char c;
a = 0x75;
b = 0xf0;
c = a & b;
printf("c = 0x%x\n",c); //按位与
a = 0x50;
b = 0x0f;
c = a | b;
printf("c = 0x%x\n",c); //按位或
a = 0xc5;
b = 0xf0;
c = a ^ b;
printf("c = 0x%x\n",c); //按位异或
a = 0xc5;
c = ~a;
printf("c = 0x%x\n",c); //按位取反
a = b = 3; //猜猜a和b是多少
c = ++a || ++b;
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0;
}
我们先来分析一下按位与运算符,在计算机的底层数据是以二进制形式进行储存的
而数字前面0x开头是表示16进制的数
我们先把它化为二进制,然后进行按位与操作,其中操作的规则如下
按位与运算的法则:
数据A | 符号 | 数据B | 结果 |
---|---|---|---|
1 | & | 1 | 1 |
1 | & | 0 | 0 |
0 | & | 1 | 0 |
0 | & | 0 | 0 |
我们对0x75和0xf0进行 & 操作得到一个新的二进制数,这个二进制数表示为十进制就是112,但是输出是以十六进制形(%x)式输出的,所以转成十六进制就是0x70
其它运算规则以及过程也附上:
按位或运算的法则:
数据A | 符号 | 数据B | 结果 |
---|---|---|---|
1 | | | 1 | 1 |
1 | | | 0 | 1 |
0 | | | 1 | 1 |
0 | | | 0 | 0 |
按位异或运算的法则:
数据A | 符号 | 数据B | 结果 |
---|---|---|---|
1 | ^ | 1 | 0 |
1 | ^ | 0 | 1 |
0 | ^ | 1 | 1 |
0 | ^ | 0 | 0 |
其中按位异或我们可以理解为没有进制的二进制加法
1+1=0
1+0=0
0+1=1
0+0=0
但是这个只能算是记忆方法哦
按位取反运算的法则:
符号 | 数据A | 结果 |
---|---|---|
~ | 1 | 0 |
~ | 0 | 1 |
最后看看输出的结果:
就差最后一个
a = b = 3; //猜猜a和b是多少
c = ++a || ++b;
printf("a = %d\n",a);
printf("b = %d\n",b);
没有解决,看到答案a是4但是b还是3
结合我们之前小课堂讲的自增运算的讲解,这里为啥b没有加1呢
我们再来看看运算优先级:
可以看到我们是先进行自增运算然后才进行逻辑与操作
想想看
1 | 1 = 1
1 | 0 = 1
只要是前面一个数是true后面不管是0还是1,结果都是1
所以这里c语言优化了运算过程,也就是不执行后面的++b运算符
所以答案就是a=4 b=3了