在一些代码示例中,我看到了算法来检查是否设置了一个位,如下所示:
for (int i = 0; i < 32; i++)
{
// count number of elements with i'th bit set
int count = 0;
for (int j = 0; j < n; j++)
if ( (arr[j] & (1 << i)) ) // array holds integers
count++;
其中if语句检查数组中的当前数字是否已打开第i位。例如,如果数组的当前索引中的数字是4(4位表示中的0100)并且i是2(对应于第3位),则AND操作将是
0100
0100 &
= 0100
返回4. 由于if语句检查真值(值为1或0),如何将AND操作解释为刚才描述的情况?
答案 0 :(得分:3)
如果这个例子编译,你很可能在C,C ++或Objective-C中进行(而不是Java或C#,这个例子不能编译)。
C和C ++都有一条规则,在需要逻辑表达式的上下文中将零解释为false
并将所有非零值解释为true
。想象一下,隐式!= 0
被附加到期望逻辑表达式的上下文中的数值表达式。
if
语句需要逻辑表达式,因此任何非零值都被视为true
。这就是为什么这个实现有效。
答案 1 :(得分:3)
基于其他答案,这实际上是在C ++ 11标准中说明的。
4.12布尔转换[conv.bool]
1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为 bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为prvalue 类型bool;结果值为false。