Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要检查按位AND的结果是否等于其中一个值?_C++_C - Fatal编程技术网

C++ 为什么要检查按位AND的结果是否等于其中一个值?

C++ 为什么要检查按位AND的结果是否等于其中一个值?,c++,c,C++,C,我刚刚发现了一个代码,其中完成了“按位and”,但无法清楚地理解逻辑 if( (value1 & value2 ) == value2) { //Some code. } 我知道二进制逐位运算是在变量上完成的。 但我的问题是,如果“value1”和“value2”之间的“按位and”产生“value2”,那么我应该推断出关于这些值的哪些信息?因为=具有比和更高的优先级,所以表达式实际上是: (value1 & (value2 == value2)) 内部表达式的计算结

我刚刚发现了一个代码,其中完成了“按位and”,但无法清楚地理解逻辑

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,是的,我的意思正是您所写的。这是我打字时的错误。