检查是否未设置位

时间:2014-12-01 19:29:15

标签: c bit-manipulation

如果我使用这个: if(value & 4)检查该位是否已设置,然后如何检查该位是否未设置?

我试过了 if(!value & 4)if(~value & 4)if(value ^ 4),但都不起作用。

4 个答案:

答案 0 :(得分:20)

当您编写if(value & 4)时,C会检查结果是否为非零。基本上,它意味着

if((value & 4) != 0) {
    ...
}

因此,如果您想检查该位是否而不是,请将相等的结果与零进行比较:

if((value & 4) == 0) {
    ...
}

答案 1 :(得分:8)

你可以采取多种方式,但最简单的(最简单的,需要最少的思考)只会否定你已经拥有的整个表达方式:

if (!(value & 4))

答案 2 :(得分:4)

简单地:

if ((value & 4) == 0)

为什么?

如果value是01110011

然后

01110011
&
00000100
--------

因为第4位关闭,将返回0。

答案 3 :(得分:0)

来自hastebin的行写得不好,代码无法访问,并且在很大程度上取决于C运算符的优先级。而且没有按预期工作。

来自hastebin的行:

if( cur_w > source.xpos + source.width
&&
!(source.attributes & DBOX_HAS_SHADOW) )
{
    break;
    return; 
}

应该写成:

if( (cur_w > (source.xpos + source.width))  // has curr_w exceeded sum of two other fields?
    &&
    ((source.attributes & DBOX_HAS_SHADOW) != DBOX_HAS_SHADOW ) //is bit == 0?
{
    break;
}