C学习:逻辑运算和位运算易混点

问题引入


特別注意这两个不常用的:~aa^b,前者按位取反,后者按位异或运算(不同得1,相同得0)。因为久了不用取反运算的话,容易搞混,下意识错用!a来表示按位取反,而本质是对a的整体做逻辑非运算。

另外,为便于记忆理解 &&&||| 的区别,可以理解为一个&表示对变量的按位操作,两个&即&&则考察变量整体来操作。 而且a & ba && b,前者a和b都会运算并将a、b按位与操作,后者只要a为假,就直接返回0,不会再去判断b真假了。||| 与之类似。

具体分析


位运算符

~a;       			// 按位取反,一元运算, 1011 > 0100
^a;       			// 异或操作 01=>1 10>1 00>0 11>0
a & 0x7f; 			// 按位与 
a | 0x7f; 			// 按位或

逻辑运算符,与或非,用法如下

!a;               	// 非操作,一元操作,若a整体不为0,结果0;若为0,结果1;
a < 0 && b > 0;   	// 与
a < 0 || b > 0;   	// 或

条件运算符中 & 与 &&| 与 || 的区别

  • & 左右两边条件都要判断,哪怕左边已经为假
  • && 一旦左边条件为假,则不判断右边,直接返回假
  • | 左右两边条件都要判断
  • || 一旦左边条件为真,则不判断右边,直接返回真.

验证:

int a = 0;
int b = 1;
if ( a == 0 || (b = a) ) {
   
   ;
}
printf("%d ", a);
printf("%d ", b);

以上代码,则输出结果为

 01   

如果 || 换为 |,输出结果会变为0, 0

相关资料


1、C 运算符之逻辑关系运算、位运算
2、容易搞混的逻辑运算符和位运算符