我刚刚找到了一个代码,其中“按位和”已完成,但无法清楚地理解逻辑。
if( (value1 & value2 ) == value2)
{
//Some code.
}
我知道二进制AND操作是在变量上完成的。 但我的问题是,如果“value1”和“value2”之间的“按位和”产生“value2”,我应该推断出哪些关于价值的信息?
答案 0 :(得分:5)
由于==
的优先级高于&
,因此表达式有效:
(value1 & (value2 == value2))
内部表达式将始终求值为true,因此数值将为1.然后,您将留下value1 & 1
,它在布尔上下文中测试是否设置了最低有效位。
((value1 & value2) == value2)
第一部分返回的值只包含value1
和value2
中设置的位。然后,它将该值与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
)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}检查所有是否存在所需的属性。