2015-04-02 35 views
0
#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(),写成更简单/更清洁的方式吗?

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

+0

应该检查的第一个条件是什么? – 2015-04-02 02:45:10

+0

第一个条件:如果它能飞,那么它也是鹰。如果它有爪子,那么它也是鹰。 – ontherocks 2015-04-02 02:48:10

+0

那么,为什么你会期望第二个条件成为现实?如果它既可以飞又有爪,它可以飞,因此已经被认定为鹰? – 2015-04-02 02:51:10

回答

1

输入类型是否正确?

定义propint是好的。只知道你有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); 
}