2017-03-16 84 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; 
    //.... 
} 

这种方式可以确保每面膜具有单个位集。