[英]Combining Enum Value using Bitmask
我知道可以在枚舉值中使用位掩碼,但我不知道如何創建它。
我有一個簡單的枚舉:
enum State
{
minimizing = 0,
maximizing,
minimized,
maximized
};
狀態始終為State.minimized
或State.maximized
,並且可以在調整大小時具有其他狀態。 因此,可以最大限度地減少和最小化
我將假設myState
具有enum State
的類型。
enum
的傳統用法是創建此類變量可以采用的常量值。 您希望將變量myState
設置為enum
定義的值的組合 。
enum
將1,2,4和8定義為有效值,但您希望能夠將變量設置為4 | 2 = 6.雖然C對所有enum
使用實現定義的int
類型,但在C ++中並非如此。 myState = 6
在C ++中無效。 實際上, myState = 4
在C ++中無效,您需要顯式轉換或使用enum
的常量名稱之一。
盡管可能在C中,但將myState
設置為未由其類型定義的值(例如,為6)並不是一個好習慣。
在您的情況下,似乎結果的解決方案是:
typedef enum {
OTHER,
MINIMIZED,
MAXIMIZED
} win_size_t;
typedef struct {
win_size_t current;
win_size_t next;
} state_t;
state_t myState;
這樣,您可以不依賴地寫入current
和next
字段。
如果您仍想擁有位字段,可以按位設置結構元素的大小。 但它有點危險,位字段的實現取決於你的編譯器。 我甚至不確定編譯器是否會接受在一個字段中有一個枚舉類型(在C中應該沒問題,因為enum
是int
)。
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
先前給出的解決方案當然是有效的。 我的觀點是,如果你的變量myState
將你的enum State
作為類型,它應該只使用enum
的成員作為其值,而不是組合。
也許myState
有另一種類型,我知道什么。
如果myState
不是enum State
類型,那么您可以組合使用enum
中定義的常量。
enum State {
MINIMIZING = (1u << 0),
MAXIMIZING = (1u << 1),
MINIMIZED = (1u << 2),
MAXIMIZED = (1u << 3),
};
unsigned int myState = 0;
myState |= MAXIMIZED; // sets that bit
myState &= ~MAXIMIZED; // resets that bit
這允許您在一個任務中執行兩項操作:
myState = MAXIMIZED | MINIMIZING;
但也有你不想要的東西:
myState = MAXIMIZED | MINIMIZED; // does that make sense?
對枚舉中的每個值使用不同的位,例如:
enum State
{
minimizing = 0x01, // 00000001
maximizing = 0x02, // 00000010
minimized = 0x04, // 00000100
maximized = 0x08 // 00001000
}:
然后,您可以按位或( minimizing | maximized
)組合多個值,並按位和( bool is_minimized = (flags & minimized);
)測試值。
我剛剛在VS2012中試過這個,如果你使用的是bitfields,優化器似乎正確地組合了位而不需要任何幫助。
struct BITS { int x: 1; int y:1; };
然后
BITS b;
b.x = b.y = 1;
用一條指令設置兩個位。
您可以通過指定枚舉中的所有字段並增加2的冪來獲得此效果,以獲得位掩碼效果。 例如,在您的情況下:
enum State
{
minimizing = 1,
maximizing = 2,
minimized = 4,
maximized = 8
};
因此,您可以使用(State.maximized | State.minimizing)
組合。 但是,這不適用於僅限於State.maximized
或State.minimized
的限制。 如果你想這樣做,你可以將它們轉換為單個位,但我想在這個例子中你可能希望能夠有一個既沒有最大化也沒有最小化的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.