位标志作为验证例程中的输入

时间:2015-04-02 02:39:41

标签: c++ bit-manipulation

#include <iostream>

using namespace std;

enum Property
{
    HasClaws   = 1 << 0,
    CanFly     = 1 << 1,
    EatsFish   = 1 << 2,
    Endangered = 1 << 3
};

bool isHawk(int prop)  // <-- Is the input type correct?
{
    //  If it can fly then also it is a hawk. If it has claws then also it is a hawk.
    if (prop& HasClaws || prop& CanFly)
    {
        return true;
    }

    //  If it can fly as well has claws then also it is a hawk.
    if ((prop& (HasClaws | CanFly)) == (HasClaws | CanFly))  //<-- Can this be written cleaner/simpler
    {
        return true;
    }

    return false;
}

int main(int argc, char *argv[])
{
    cout << "Value = " << isHawk(CanFly | HasClaws) << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

我的几个问题在上面的代码中都是内联的。

在第二个条件if ((prop& (HasClaws | CanFly)) == (HasClaws | CanFly))中,我真正想要检查的是,它是否既可以飞行又有爪子。 OR是正确的运算符,还是AND?调用isHawk(CanFly | HasClaws)时的问题也一样。

一般来说,如上所述isHawk()可以用更简单/更清洁的方式编写吗?

这只是一个示例代码。它与鹰派或鹰派无关。

1 个答案:

答案 0 :(得分:1)

  

输入类型是否正确?

prop定义为int很好。只知道你有28个未使用的字节。您可以考虑使用unsigned charunsigned short来减少使用的位数。

  

这可以写得更清洁/更简单

您可以在枚举中添加另一个值,将HasClawsCanFly位组合在一个名称下:

enum Property
{
    HasClaws   = 1 << 0,
    CanFly     = 1 << 1,
    EatsFish   = 1 << 2,
    Endangered = 1 << 3,
    HasClawsAndCanFly = HasClaws | CanFly
};

if ((prop & HasClawsAndCanFly) == HasClawsAndCanFly)
  

在第二个条件if ((prop& (HasClaws | CanFly)) == (HasClaws | CanFly))中,我真正想要检查的是,它是否既可以飞行又有爪子。 OR是正确的算子还是应该是AND?

|是正确的。真正的问题是第一个||中的if。如果您自行传递HasClawsCanFly,则应在返回true时返回false

isHawk(HasClaws) // returns true
isHawk(CanFly) // returns true
isHawk(HasClaws | CanFly) // returns true
isHawk(HasClawsAndCanFly) // returns true

您需要完全删除第一个if

bool isHawk(int prop)
{    
    if ( (prop & (HasClaws | CanFly)) == (HasClaws | CanFly))
    //if ( (prop & HasClawsAndCanFly) == HasClawsAndCanFly)
    {
        return true;
    }

    return false;
}

然后可以简化:

bool isHawk(int prop)
{    
    return ((prop & (HasClaws | CanFly)) == (HasClaws | CanFly));
    //return ((prop & HasClawsAndCanFly) == HasClawsAndCanFly);
}