2017-03-16 29 views
2

我真的很新奇在C++中使用DWORD來代替布爾值。因此,請原諒我的問題。使用C++中的dword檢查多重布爾條件

我有一個enum

enum foo 
{ 
    foo1 = 0x0; 
    foo2 = 0x1 
    //.... 
} 
DWORD foo; 

我用這enum檢查多個條件:

if(somethinghappenstothisvariable) 
{ 
    foo|= foo1; 
} 

if(somethinghappenstosecondvariable) 
{ 
foo|=foo2; 
} 

現在在另一個文件中我要檢查各個變量的條件

if(foo &foo1) 
{ 
    //do something; 
} 

if(foo & foo2) 
{ 
//do something; 
} 

我覺得如果兩個條件都是true,導致foo & foo2僅爲真,而foo & foo1將不會像DWORD的值將爲1那樣,將值加起來爲DWORD。因此,我想知道是否有我可以檢查個人DWORD價值。

+2

foo | = foo1; ==> foo | = 0 == foo,並且foo&foo1 == foo&0 ==> 0,我想你想要foo1 = 0x1(2^0),foo2 = 0x2(2^1),foo3 = 0x4 (2^2)... – willll

+0

yup,foo1在當前實現中爲零。最低的實際位是值「1」而不是「0」。 「0」不匹配任何位。每個位的值都需要是前一個值的兩倍。 –

+0

謝謝,它的工作。 – user1435077

回答

1

問題:1 =位0,0無效。 要檢查每個「條件」應該代表一個單獨的位(位0 = 1,位1 = 2等)

所以 - 一個簡單的更改:foo1 = 0x01; foo2 = 0x02;應該修復它。 注意:任何其他檢查都應該代表位值,而不是有序的。 換句話說,foo3 = 0x04;(不0x03;

0

你可以把它正確更容易通過轉移創造這些常量:

enum foo 
{ 
    foo1 = 1 << 0; 
    foo2 = 1 << 1; 
    foo3 = 1 << 2; 
    //.... 
} 

這種方式可以確保每面膜具有單個位集。