0

我可以在下面的 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;
    }
}
4

3 回答 3

5

==具有比&您应该使用括号更高的优先级:

a & notMyType == notMyType

被评估为

a & (notMyType == notMyType)

所以你应该改用:

(a & notMyType) == notMyType

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

于 2012-06-17T21:01:54.260 回答
3

简短的回答:没有。

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

于 2012-06-17T20:59:41.157 回答
2

是的,有一些假设和修复可能没问题。

假设:

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

您的最后一个比较看起来像一个错字(您选择使用一个标志,然后与另一个标志进行比较)。这仍然可以与某些值组合一起使用,但充其量只会令人困惑。

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

a & flag == flag

真正意思

a & (flag == flag)

这意味着,假设这都是完整的并且没有异常重载,

a & 1

意思是

(a & 1) == 1

这不是你想要的。添加括号或简单地写

a & flag

依靠 this 将转换为true当且仅当ahas flag flag。此条件看起来不像布尔值,但 C++ 提供了到布尔值的隐式转换。零值转换为false,任何其他值转换为true

于 2012-06-17T21:07:30.683 回答