解释|=,&=,~
我们在学习它们之前先了解一下它们吧,|=(或等)的解释是按位或赋值运算符,它主要的作用是计算一个数与另一个数或运算之后的结果。
下表是或运算的运算规则(只要有一个元素为真,那么结果就为真)
元素1 | 元素2 | 结果 |
---|---|---|
0 |
0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
&=(与等)的解释是按位与赋值运算符,它的主要作用是计算一个数与另一个数与运算之后的结果。
下表是或运算的运算规则(只有两个元素都为真,结果才为真)
元素1 | 元素2 | 结果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
~(取反)的解释是按位取反操作符,它的作用是对一个数的每个二进制位取反,就是把0变为1,把1变为0。
题目练习
好啦,前置知识就这些,我们来做一些练习吧,请听题:
将13转换为二进制数是 00000000 00000000 00000000 00001101,现在杰克想要将1101中间的0转换为1,你帮帮他吧。
题目分析
我们根据题目了解到杰克想将一个数某个二进制位中0转换为1,我们通过前置知识了解到,想要将0转换为1只需要使用一个或运算,假设a=13,我们将a与1或等一下就可以得到,那么问题来啦,我们如何使1走到我们想要的位置呢,这个时候我们就需要将1左移一下啦,使用左移操作符<<将1移到与1101中0对齐的位置。之后进行或等运算,a|=(1<<1)。
00000000 00000000 00000000 00001101
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
代码表示
我们来看看代码吧
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 13;
a |= (1 << 1);
printf("%d\n", a);
return 0;
}
运行结果
得到结果为15,与我们预期符合,15的二进制为
00000000 00000000 00000000 00001111
题目扩展
扩展题目1
那我们如果想将13的二进制数中的01101,最前面一位变为1怎么操作呢
00000000 00000000 00000000 00001101
↑
这个时候我们想到,我们将1可以左移4位之后再与13进行或等运算,我们来看看
代码表示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 13;
a |= (1 << 4);
printf("%d\n", a);
return 0;
}
运行结果
、
结果验证
我们得到结果为29,那么我们来验证一下
00000000 00000000 00000000 00011101
1*2^0+0*2^1+1*2^2+1*2^3+1*2^4=29
结果正确
题目再扩展
题目分析
那么我们可不可以再运算一下将之前改变的1再变回为0呢
00000000 00000000 00000000 00011101
↑
我们想要将这一位再变为0,需要进行与操作,当1与0的时候,那么我们这一位就可以变回为0,有小伙伴要说啦,那么我们直接将29&0可不可以啊,不行!!!
这里与我们之前的情况不一样,之前当我们将13|1的时候,是在一堆0里只有1,我们可以直接进行移位之后运算,这里就不行了,我们怎么可以在一堆0里找到0之后参与运算呢,这里我们就需要用到取反操作符了,既然我们可以在一堆0里找到1,那么我们将它们按位取反之后,不就是在一堆1里找0了嘛,然后我们将0再左移之后运算不就好啦。当然也不用担心改变其他位的数字,因为0&1之后还是0,1&1之后还是1。
图解
那么这里我们进行操作。
代码表示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 13;
a |= (1 << 4);
printf("%d\n", a);
a &= (~(1 << 4));
printf("%d\n", a);
return 0;
}
运行结果
与我们假设结果一致,计算无误。
今天就到这里啦,加油!