C++ 为什么要检查按位AND的结果是否等于其中一个值?
我刚刚发现了一个代码,其中完成了“按位and”,但无法清楚地理解逻辑C++ 为什么要检查按位AND的结果是否等于其中一个值?,c++,c,C++,C,我刚刚发现了一个代码,其中完成了“按位and”,但无法清楚地理解逻辑 if( (value1 & value2 ) == value2) { //Some code. } 我知道二进制逐位运算是在变量上完成的。 但我的问题是,如果“value1”和“value2”之间的“按位and”产生“value2”,那么我应该推断出关于这些值的哪些信息?因为=具有比和更高的优先级,所以表达式实际上是: (value1 & (value2 == value2)) 内部表达式的计算结
if( (value1 & value2 ) == value2)
{
//Some code.
}
我知道二进制逐位运算是在变量上完成的。
但我的问题是,如果“value1”和“value2”之间的“按位and”产生“value2”,那么我应该推断出关于这些值的哪些信息?因为
=
具有比和更高的优先级,所以表达式实际上是:
(value1 & (value2 == value2))
内部表达式的计算结果将始终为true,因此数值将为1。然后剩下value1&1
,在布尔上下文中测试是否设置了最低有效位
然而,这可能不是我们的初衷。最有可能的是:
((value1 & value2) == value2)
第一部分返回的值仅包含在value1
和value2
中设置的位。然后将相等值与value2
进行比较
因此,如果value1
中设置的位是value2
中设置的位的超集,则表达式的计算结果为true。例如,如果您的变量包含一组布尔标志,并且您想知道是否启用了一组特定的标志,则这可能非常有用。所有测试值位都设置在另一个值中
几个简单的例子:
1111 & 1010 = 1010
1110 & 1010 = 1010
1010 & 1010 = 1010
0010 & 1010 = 0010
1000 & 1010 = 1000
1111 & 1010 = 1010
1110 & 1010 = 1010
1010 & 1010 = 1010
0010 & 1010 = 0010
1000 & 1010 = 1000
在这种情况下,value2
既用作掩码,又用于检查实际值
在这种情况下,value1
的值与value2的值不同,直接比较将失败
如果我们只对值的某一部分感兴趣,我们必须首先屏蔽掉不必要的位,然后执行比较
假设
value1
的值为14
(二进制00001110
)
value2
的值为2
(二进制00000010
)
- 我们只想检查LSB中包含的值,LSB+1是否等于
value2
所持有的值
那么,在这种情况下,做一个
if (value1 == value2)
将会失败,也不会达到我们的目的。奥托
if( (value1 & value2 ) == value2)
将首先屏蔽掉value1
中的其他位值,然后执行与value2
的比较,从而得到所需的结果
在检查标志值时可以看到这种技术的广泛使用。这是检查位字段中是否设置了一组标志的经典方法
enum FileAttributes {
ReadOnly = 1,
Archive = 2,
System = 4,
Hidden = 8
};
unsigned int requiredAttrs = System | Hidden;
if((GetFileAttributes(fileName) & requiredAttrs) == requiredAttrs) {
...
}
&
用于屏蔽我们不关心的属性(例如,文件可能是只读的,但我们不关心),=
检查是否所有必需的属性都在那里。这可能是一个输入错误,因为它相当于value1&(value2==value2)
。哪个是value1&true
value1&value2==value2
检查value2
s模式在value1
中是否匹配完全不清楚该语句中不清楚的内容。该代码中是否有一些括号未显示?代码就是这样还是更多,因为你应该能够从上下文中看到它在做什么。我刚刚编辑了我的问题。事实上,我错过了包含value1和value2的偏执。哈!你刚才在第二个答案中加入了我要说的内容。非常彻底。我怀疑最初的程序员的意思。我怀疑其意图是((value1&value2)=value2)
,它检查value2
中设置的所有位是否也在value1
中设置。“您想知道是否启用了一组特定的标志。”-说得更清楚:这会告诉您是否所有给定的标志都已设置;与告诉您是否设置了任何给定标志的value1&value2
相反。@AndrewHenle,是的,我的意思正是您所写的。这是我打字时的错误。