问题引入
特別注意这两个不常用的:~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
。