按位AND与if语句

时间:2012-06-17 20:57:14

标签: c++

我可以使用bitwise&在C ++代码中如下所示。该方法根据按位运算的结果返回一个布尔值。

bool SetValue( myType a )
{
    if( a & notMyType == notMyType )
    {
        return false;
    }

    if( a & newMyType == newMyType )
    {
        SendNew(a);
        return true;
    }

    if( a & oldMyType == oldMyType )
    {
        SendOld(a);
        return true;
    }
}

3 个答案:

答案 0 :(得分:5)

==的优先级高于&,您应该使用parens:

a & notMyType == notMyType

评估为

a & (notMyType == notMyType)

所以你应该使用:

(a & notMyType) == notMyType

实际上你使用的是按位AND运算符(&),但你可能想要使用逻辑AND运算符(&&)。

答案 1 :(得分:3)

简答:否。

通常,对任何不是原始类型的东西使用按位运算被认为是一个坏主意(我不知道无论如何都会完成)。此外,我很少看到按位运算证明对非自然数的东西有用的情况。

答案 2 :(得分:2)

是的,可能会有一些假设和修正。

假设:

  • MyType是一个整数类型
  • 常量通常是位值(1,2,4,...)或其语义上的自然组合

您的上一次比较看起来像一个拼写错误(您选择使用一个标志,并与另一个标志进行比较)。这仍然适用于某些价值组合,但最多会让人感到非常困惑。

您还需要修复运算符优先级。

a & flag == flag

真的意味着

a & (flag == flag)

这意味着,假设这是完整的而不是异常过载,

a & 1

表示

(a & 1) == 1

这不是你想要的。添加括号或只写

a & flag

当且仅当true有标记a时,才会依赖此flag。此条件看起来不像布尔值,但C ++提供了对Boolean的隐式转换。零值转换为false,任何其他值转换为true