簡體   English   中英

使用位掩碼組合枚舉值

[英]Combining Enum Value using Bitmask

我知道可以在枚舉值中使用位掩碼,但我不知道如何創建它。

我有一個簡單的枚舉:

enum State
{
    minimizing = 0,
    maximizing,

    minimized,
    maximized
};

狀態始終為State.minimizedState.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;

這樣,您可以不依賴地寫入currentnext字段。

如果您仍想擁有位字段,可以按位設置結構元素的大小。 但它有點危險,位字段的實現取決於你的編譯器。 我甚至不確定編譯器是否會接受在一個字段中有一個枚舉類型(在C中應該沒問題,因為enumint )。

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.maximizedState.minimized的限制。 如果你想這樣做,你可以將它們轉換為單個位,但我想在這個例子中你可能希望能夠有一個既沒有最大化也沒有最小化的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM