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

时间:2015-08-12 01:53:20

标签: c++ c

我刚刚找到了一个代码,其中“按位和”已完成,但无法清楚地理解逻辑。

if( (value1 & value2 ) == value2)
{
    //Some code.
}

我知道二进制AND操作是在变量上完成的。 但我的问题是,如果“value1”和“value2”之间的“按位和”产生“value2”,我应该推断出哪些关于价值的信息?

4 个答案:

答案 0 :(得分:5)

由于==的优先级高于&,因此表达式有效:

(value1 & (value2 == value2))

内部表达式将始终求值为true,因此数值将为1.然后,您将留下value1 & 1,它在布尔上下文中测试是否设置了最低有效位。

然而,这可能不是预期的。它最有可能是:

((value1 & value2) == value2)

第一部分返回的值只包含value1value2中设置的位。然后,它将该值与value2进行相等。

如果value1中设置的位是value2中设置的位的超集,则表达式的计算结果为true。例如,如果您的变量包含一组布尔标志,并且您想知道是否启用了一组特定的标志,那么这可能很有用。

答案 1 :(得分:5)

所有测试的值位都设置在另一个值中。

一些简单的例子:

1111 & 1010 = 1010
1110 & 1010 = 1010
1010 & 1010 = 1010
0010 & 1010 = 0010
1000 & 1010 = 1000

答案 2 :(得分:1)

在这种情况下,value2都用作掩码并检查实际值。

如果value1具有除value2以外的其他值,则直接比较将失败。

如果我们只对值的某个部分感兴趣,我们必须首先屏蔽不必要的位然后执行比较。

假设,

  • value1的值为14(二进制00001110),
  • value2的值为2(二进制00000010
  • 我们只对检查LSB中包含的值感兴趣,LSB +1等于value2所持有的值

那么,在这种情况下,做一个

  if (value1 == value2)     

会失败,不会达到我们的目的。 OTOH,

 if( (value1 & value2 ) == value2)

将首先屏蔽value1中的其他位值,然后与value2进行比较,这将为我们提供所需的结果。

在检查标志值时会看到这种技术的广泛使用。

答案 3 :(得分:1)

这是检查是否在位域中设置了一组标志的经典方法。

enum FileAttributes {
    ReadOnly = 1,
    Archive = 2,
    System = 4,
    Hidden = 8
};

unsigned int requiredAttrs = System | Hidden;
if((GetFileAttributes(fileName) & requiredAttrs) == requiredAttrs) {
    ...
}

&用于屏蔽我们不关心的属性(例如,文件可能是ReadOnly,但我们不关心),{{1}检查所有是否存在所需的属性。