C++ 如何用二进制运算符的比较结果解释条件?

C++ 如何用二进制运算符的比较结果解释条件?,c++,C++,我有以下代码: if((bob.prop & 0x100) == 0x100) { // some code } 我发现这部分: bob.prop & 0x100 意味着 是否将bob.prop设置为0x100 所以,我认为它给了我真假。但该代码的结果也与0x100相比较: if((bob.prop & 0x100) == 0x100) { 这是什么?这是什么意思?bob.prop&0x100正在对bob.prop进行按位and运算,并使用0x100。if语

我有以下代码:

if((bob.prop & 0x100) == 0x100) {
    // some code
}
我发现这部分:

bob.prop & 0x100
意味着

是否将bob.prop设置为0x100

所以,我认为它给了我真假。但该代码的结果也与0x100相比较:

if((bob.prop & 0x100) == 0x100) {

这是什么?这是什么意思?

bob.prop&0x100正在对bob.prop进行按位and运算,并使用0x100。if语句确保等于0x100

因此,第一个测试是计算一个表达式,并将其放入if中,检查它是否匹配0x100


请注意,您不是在测试bob.prop是否设置为0x100,而是在检查是否设置了一位。因此,对于输入0x100、0x101、0x102、0xfff,…

bob.prop&0x100正在对bob.prop与0x100进行按位and运算。if语句确保等于0x100

因此,第一个测试是计算一个表达式,并将其放入if中,检查它是否匹配0x100


请注意,您不是在测试bob.prop是否设置为0x100,而是在检查是否设置了一位。因此,对于二进制输入0x100、0x101、0x102、0xfff,…

0x100
的表达式为true,它设置了第9位

执行
bob.prop&0x100
过滤掉
bob.prop
中的第9位。例如:

bob.prop         & 0x100
1010110101110010 & 0000000100000000 gives 0000000100000000
0110110001101011 & 0000000100000000 gives 0000000000000000
它之所以这样做是因为它是两个操作数的按位AND。这意味着结果将只在两个操作数中都设置了位的情况下设置位

然后检查结果是否等于
0000000 100000000
,这与询问“是否设置了第9位?”

无需执行此最终比较,因为任何大于0的整数值都将转换为
true
,而0将转换为
false
。你可以写:

if(bob.prop & 0x100)

二进制文件中的
0x100
0000000 100000000
,它设置了第9位

执行
bob.prop&0x100
过滤掉
bob.prop
中的第9位。例如:

bob.prop         & 0x100
1010110101110010 & 0000000100000000 gives 0000000100000000
0110110001101011 & 0000000100000000 gives 0000000000000000
它之所以这样做是因为它是两个操作数的按位AND。这意味着结果将只在两个操作数中都设置了位的情况下设置位

然后检查结果是否等于
0000000 100000000
,这与询问“是否设置了第9位?”

无需执行此最终比较,因为任何大于0的整数值都将转换为
true
,而0将转换为
false
。你可以写:

if(bob.prop & 0x100)

是否将bob.prop设置为0x100?
将是
bob.prop==0x100
是否将bob.prop设置为0x100?
将是
bob.prop==0x100
。因此
0x100
是2个字节,对吗?我们将这2个字节解释为16位,并进行逐位和运算。此操作的结果与另2个字节进行比较–使用
0x100
。对吧?“你可以写:”:只有当你的目标是模糊化。(另一方面,我倾向于测试
!=0
,而不是
==0x100
)+1。我要补充的是,虽然在这种情况下,
=
是多余的,但一旦掩码中设置了一个以上的位(例如,
0x110
),它就会产生不同。然后,“所有都设置好了”和“任何都设置好了”。@JamesKanze在这种情况下,我会说“模糊化”是主观的-如果没有
===
@SharikovVladislav更可能是32位,我就更清楚了。他只是为了显示而使用了16位,因为所有额外的高阶位都是0。所以
0x100
是2个字节,对吗?我们将这2个字节解释为16位,并按位进行and。此操作的结果与另一个2字节–带有
0x100
。对吗?“你可以这样写:”:只有当你的目标是模糊化时。(另一方面,我倾向于测试
!=0
,而不是
==0x100
)+1。我只想补充一点,虽然
=
在这种情况下是多余的,但一旦在掩码中设置了一个以上的位,就会产生不同(例如,
0x110
。那么,“所有都设置好了”和“任何都设置好了”之间就有区别了。@JamesKanze我想说,在这种情况下,“模糊处理”是主观的——没有
==
@sharikovladislav更可能是32位,我更清楚。他只是出于显示目的使用了16位,因为所有额外的高阶位都是0。