2011-08-26 72 views
2

我今天看到了這行代碼,不知道它在做什麼。這個枚舉是什麼意思?

typedef enum { 
    SomeOptionKeys = 1 << 0 // ? 
} SomeOption; 

某些用法或示例會有所幫助。謝謝!

+0

'1 << 0 == 1',我不明白這一點。這是完整的'枚舉'?這些結構通常與'|'一起使用。 – 2011-08-26 20:04:42

+0

@WTP可能是它的一部分。爲了完整起見,在枚舉中看到多個值爲'fst = 1 << 0,sec = 1 << 1,thr = 1 << 2'是常見的(當然,在列中,線)。 – sidyll

回答

9

它看起來像它定義了應該包含一組標誌的枚舉類型。您希望看到更多的人定義是這樣的:

typedef enum { 
    FirstOption = 1 << 0, 
    SecondOption = 1 << 1, 
    ThirdOption = 1 << 2 
} SomeOption; 

因爲它們被定義爲兩個大國,每個值對應於一個整型變量的單個位。因此,您可以使用按位運算符來合併它們並測試它們是否已設置。這是C代碼中的一種常見模式。

你可以寫這樣的代碼,結合了他們:

SomeOption myOptions = FirstOption | ThirdOption; 

而且你可以檢查該選項的設置類似於此:

if (myOptions & ThirdOption) 
{ 
    ... 
} 
+0

+1,因爲它在我看來是最完整的答案,我也從中學到了一些東西。 – 2011-08-26 20:08:55

+0

感謝您的全面解答! – saurb

+0

很高興我能幫到你。 –

2

它只是規定了枚舉值1。它可能是意在表明該值將成爲下一個可能會被分配1 << 1 2的冪等

4

SomeOptionKeys值是之一,這是一個有用的代表性與標誌工作時:

typedef enum { 
    flag1 = 1 << 0, // binary 00000000000000000000000000000001 
    flag2 = 1 << 1, // binary 00000000000000000000000000000010 
    flag3 = 1 << 2, // binary 00000000000000000000000000000100 
    flag4 = 1 << 3, // binary 00000000000000000000000000001000 
    flag5 = 1 << 4, // binary 00000000000000000000000000010000 
    // ... 
} SomeOption; 

白衣方式,每個標誌只有一位集,他們可以在一個位圖來表示。

編輯:

雖然,我不得不說,我可能失去了一些東西,但它似乎redundent我使用該枚舉。既然你在這個配置中失去枚舉任何優勢,你不妨使用#define

#define flag1 (1<<0) 
#define flag2 (1<<1) 
#define flag3 (1<<2) 
#define flag4 (1<<3) 
#define flag5 (1<<4) 
1

< <是左移位運算符。一般來說,當你想讓你的枚舉屏蔽一個位時就會使用它。在這種情況下,換檔實際上沒有做任何事情,因爲它是0,但您可能會看到它在更復雜的情況下彈出。

一個例子可能是這樣的:

typedef enum { 
    OptionKeyA = 1<<0, 
    OptionKeyB = 1<<1, 
    OptionKeyC = 1<<2, 
} OptionKeys; 

然後,如果你有一些功能是把一個選項鍵,你可以使用枚舉作爲位掩碼來檢查,如果一個選項設置。

int ASet(OptionKeys x){ 
    return (x & OptionKeyA); 
} 

或者,如果你有一個標誌位,並希望設置一個選項:

myflags | OptionKeyB