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

Bra*_*d R -2 c c++

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

if( (value1 & value2 ) == value2)
{
    //Some code.
}
Run Code Online (Sandbox Code Playgroud)

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

dbu*_*ush 5

由于==具有更高的优先级&,表达式是有效的:

(value1 & (value2 == value2))
Run Code Online (Sandbox Code Playgroud)

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

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

((value1 & value2) == value2)
Run Code Online (Sandbox Code Playgroud)

第一部分返回具有仅在两个中设置的位集合中的值value1value2.然后它将该值与平等值进行比较value2.

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

  • "你想知道是否启用了一组特定的标志." - 更清楚地说明:这会告诉你**是否**设置了所有**的标志; 而不是`value1&value2`,它告诉你**是否**设置了任何**. (3认同)

Dom*_*ell 5

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

一些简单的例子:

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