逻辑运算符(嵌入式行业必修)

  • &
    • 按位与
    • 如果两个相应的二进制位都为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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值