我今天看到了這行代碼,不知道它在做什麼。這個枚舉是什麼意思?
typedef enum {
SomeOptionKeys = 1 << 0 // ?
} SomeOption;
某些用法或示例會有所幫助。謝謝!
我今天看到了這行代碼,不知道它在做什麼。這個枚舉是什麼意思?
typedef enum {
SomeOptionKeys = 1 << 0 // ?
} SomeOption;
某些用法或示例會有所幫助。謝謝!
它看起來像它定義了應該包含一組標誌的枚舉類型。您希望看到更多的人定義是這樣的:
typedef enum {
FirstOption = 1 << 0,
SecondOption = 1 << 1,
ThirdOption = 1 << 2
} SomeOption;
因爲它們被定義爲兩個大國,每個值對應於一個整型變量的單個位。因此,您可以使用按位運算符來合併它們並測試它們是否已設置。這是C代碼中的一種常見模式。
你可以寫這樣的代碼,結合了他們:
SomeOption myOptions = FirstOption | ThirdOption;
而且你可以檢查該選項的設置類似於此:
if (myOptions & ThirdOption)
{
...
}
它只是規定了枚舉值1。它可能是意在表明該值將成爲下一個可能會被分配1 << 1
2的冪等
的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)
< <是左移位運算符。一般來說,當你想讓你的枚舉屏蔽一個位時就會使用它。在這種情況下,換檔實際上沒有做任何事情,因爲它是0,但您可能會看到它在更復雜的情況下彈出。
一個例子可能是這樣的:
typedef enum {
OptionKeyA = 1<<0,
OptionKeyB = 1<<1,
OptionKeyC = 1<<2,
} OptionKeys;
然後,如果你有一些功能是把一個選項鍵,你可以使用枚舉作爲位掩碼來檢查,如果一個選項設置。
int ASet(OptionKeys x){
return (x & OptionKeyA);
}
或者,如果你有一個標誌位,並希望設置一個選項:
myflags | OptionKeyB
'1 << 0 == 1',我不明白這一點。這是完整的'枚舉'?這些結構通常與'|'一起使用。 – 2011-08-26 20:04:42
@WTP可能是它的一部分。爲了完整起見,在枚舉中看到多個值爲'fst = 1 << 0,sec = 1 << 1,thr = 1 << 2'是常見的(當然,在列中,線)。 – sidyll