按位’&’运算符
我在按位’&’运算符中缺乏一些基本的理解。
5 = 101 4 = 100
那么为什么以下if
条件的输出是真的并且位101 & 100
应该是假的 :
#include main() { if(5&4) printf("Yes\n"); }
5是101
4是100
5&4 不是 0:
101 100 & ↓↓↓ 100
问题解决了✓
澄清 :
在C中,每个非零值都满足if
条件。 意思是,如果你写:
if(-5) { if(100) { //Reachable code } }
鉴于:
if(0) { destroyTheWorld(); //We are safe }
5 - 101 4 - 100 5&4 - 100
是真的。
因为0b100 & 0b101
等于0b100
而后者不等于0
。
0b101 & 0b100 = 0b100
要么
5&4 = 4
4为非零并打印Yes
它进入if条件。 因为在&
操作之后它返回非零值。 在C中,对于所有非零值,它就像返回true一样。
理解按位运算符真值表是至关重要的。 考虑以下情况,其中A
和B
是输入, Y
是输出。
&(按位和)当输入A和B为真时,输出为真; 否则输出是假的
ABY --------- 0 | 0 | 0 0 | 1 | 0 1 | 0 | 0 1 | 1 | 1
| (按位或)当A或B或两个输入均为真时,输出为真; 否则输出是假的
ABY --------- 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 1
^(按位X-Or)当A和B为相反状态时,输出为真; 否则输出是假的
ABY --------- 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 0
! (按位不)输出是输入的相反状态
AY ----- 0 | 1 1 | 0
你的等式 (5和4)==(0101和0100)== 0100 == 4 == true
0101 & 0100 ------ 0100