检查是否使用AND运算符设置了位

时间:2016-09-01 23:52:39

标签: algorithm bit-manipulation

在一些代码示例中,我看到了算法来检查是否设置了一个位,如下所示:

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操作解释为刚才描述的情况?

2 个答案:

答案 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。