- &
- 按位与
- 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
&按位与
10进制 二进制 1 1 0 0
1 2 1100 &
& & & 1 0 1 0
1 0 1010 ————————————————
1 0 0 0 ---->8
- |
- 按位或
- 两个相应的二进制位中只要有一个为1,该位的结果值为1
|按位与
10进制 二进制 1 1 0 0
1 2 1100 |
| | | 1 0 1 0
1 0 1010 ————————————————
1 1 1 0 ---->14
- ^
- 按位异或
- 若参加运算的两个二进制位值相同则为0,否则为1
^异或
10进制 二进制 1 1 0 0
1 2 1100 ^
^ ^ ^ 1 0 1 0
1 0 1010 ————————————————
0 1 1 0 ---->6
- ~
- 取反
- ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1
8进制 ~ 1 0 1 0
=1 1 1 1 0 1 0 1
16进制 ~ 1 0 1 0
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
- <<
- 左移
- 用来将一个数的各二进制位全部左移N位,右补0
y=3
1 1 0 0 << 3
10进制 二进制 —————————————————
1 2 --> 1100 1 1 0 0 0 0 0
- >>
- 右移
- 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0
y=3
1 1 0 0 >> 3
10进制 二进制 —————————————————
1 2 --> 1100 1
x --> y
// x为 非负数 则高位补0 x为 负数 则高位补 1
- &&
- 需要满足两个条件
1. int a, b;
2. a = 1;
3. b = 2;
4. if ((a < 0) && (b <= 1)) ;
5. while((a > 1) && (b > 1)) ;
重点来了,逻辑与(&&)和与(&)运算是由区别的。
&: 需要将运算符两边的表达式都运行一遍,即 (a < 0) & (b <= 1), 则需运行 (a < 0) 得到 false
的结果,再运行 (b <= 1) 得到 true 的结果, 最终将代码重新规整为 if(false & true);
&&:代码从左往右执行,一旦发现有一个是 false 便终止另一边的运行,即 (a < 0) & (b <= 1), 则运行 (a < 0) 得到 false 的结果,那么将不再运行 (b <= 1) ,因为只要有一个表达式是 false 就能直接得出结论,即 (a < 0) & (b <= 1) 的结果为 false
- ||
- 只需要满足一个条件
不少人会有同样的疑问,逻辑与、逻辑或,我们知道它俩的执行方式都是从左往右,这有什么实际意义呢?我们的团队为了能使用户直接体会其中的含义,特地选取1个例子来加以说明。
例子要求:等待1次信号量,而后便一直执行 printf 语句。
1. int once_b = 1; // 一次性执行标志位,=1可执行,=0不执行
2. while(1) {
3. if (os_wait1(K_SIG) && once_b) {
4. once_b = 0;
5. }
6. if (once_b == 0) {
7. printf("持续执行这句话.\n");
8. }
9. }
分析一下,os_wait1(K_SIG)是一个等待信号量的函数,只有当接收到信号量代码才能继续执行,否则代码将卡在这个等待函数这里。假设现在信号量被接收了,代码运行到 printf 然后回到 os_wait1(K_SIG) 继续等待。但实际上我们只想等待1次信号量即可,下次代码执行到这里时能不再执行os_wait1(K_SIG) 函数,所以我们将上述的代码进行修改:
1. int once_b = 1; // 一次性执行标志位,=1可执行,=0不执行
2. while(1) {
3. if (once_b && os_wait1(K_SIG)) { // 修改此处
4. once_b = 0;
5. }
6. if (once_b == 0) {
7. printf("持续执行这句话.\n");
8. }
9. }
当信号接收1次后,once_b 变量等于0,于是下次再到 if 语句时,由于once_b 等于0也就不再执行 os_wait1(K_SIG)函数,以此就能满足我们的要求了。 至此,我们的介绍结束,该篇对逻辑或(||)的介绍相对较少,因为它的使用意义跟逻辑与(&&)一样,所以不做过多的冗余讲解。
出处:https://blog.csdn.net/China_Or_World/article/details/118489841