2015-04-02 27 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); 
}