问题引入
特別注意这两个不常用的:~a 和 a^b,前者按位取反,后者按位异或运算(不同得1,相同得0)。因为久了不用取反运算的话,容易搞混,下意识错用!a来表示按位取反,而本质是对a的整体做逻辑非运算。
另外,为便于记忆理解 & 和 &&, | 和 || 的区别,可以理解为一个&表示对变量的按位操作,两个&即&&则考察变量整体来操作。 而且,a & b 和 a && 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);
以上代码,则输出结果为
0 ,1
如果 || 换为 |,输出结果会变为0, 0。

京公网安备 11010502036488号