2012-12-06 43 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

請注意,但我認爲你完全沒有讀到這個問題,第一我寫'這個枚舉是在一個組件內部,所以我不能改變它',特別是標題,它說'沒有按位' –