2012-12-06 100 views
1

如果枚举包含多个可能的值,如何将枚举与枚举进行比较?将枚举与多个值进行比较并且不会逐位

例:下列枚举

typedef enum { 
    EnumValueA = 2, 
    EnumValueB = 3, 
    EnumValueC = 4, 
    EnumValueD = (0 | -1) 
} EnumValues; 

当比较可变像BOOL result = (a == EnumValueD)我得到NO如果int a = 0YES如果int a = -1

而且,此枚举是一个组件内,所以我只是不能改变it..How

我怎样才能让这个比较的回报是两个0-1

回答

4

你的问题是基于一个误解。该生产线

EnumValueD = (0 | -1) 

表示 “多个值”。这是一个“按位或者”运算符:它对数字零和负数执行一个操作(按位),并且得到一个一个答案。这是一个奇怪的代码(可能与整数字节大小问题有关),但你只需要测试-1。 (如果你真的想要安全,你可以测试对(0|-1),我想。)

道德:不要混淆逻辑或||与按位或操作|

+0

多么愚蠢的错误我的...韩国社交协会指出来! –

0

让它是这样的:

typedef enum { 
    EnumValueA = 1, 
    EnumValueB = 2, 
    EnumValueC = 4, 
    EnumValueD = 8 
} EnumValues; 

所以,你可以用逻辑或值结合起来,这样可以有多个值。
然后使用逻辑和检查是否包含单个值。
因此,例如:

EnumValues val= EnumValueD | EnumValueC; 

然后读值:

if(value & EnumValueA) 
    actionA(); 
if(value & EnumValueB) 
    actionB(); 
if(value & enumValueC) 
    actionC(); 
if(value & enumValueD) 
    actionD(); 

所以,如果有多个值,多个动作将被执行。 如果你愿意,你也可以放,而不是使用或价值,其中包括多个值,:

typedef enum { 
    EnumValueA = 1, 
    EnumValueB = 2, 
    EnumValueC = 4, 
    EnumValueD = 8, 
    EnumValueCAndD= 12 
} EnumValues; 
+0

请注意,但我认为你完全没有读到这个问题,第一我写'这个枚举是在一个组件内部,所以我不能改变它',特别是标题,它说'没有按位' –