8

我知道可以在枚举值中使用位掩码,但我不知道如何创建它。

我有一个简单的枚举:

enum State
{
    minimizing = 0,
    maximizing,

    minimized,
    maximized
};

状态总是State.minimizedor State.maximized,并且可以在调整大小时具有其他状态。所以某些东西可以最大化和最小化

4

4 回答 4

20

我将假设myState具有您的enum State.

的传统用途enum是创建这种类型的变量可以采用的常量值。您希望将变量设置myState为.enum

enum1、2、4 和 8 定义为有效值,但您希望能够将变量设置为 4 | 2 = 6。虽然 C 对 all 使用实现定义的int类型enum,但在 C++ 中并非如此。myState = 6在 C++ 中无效。实际上,myState = 4在 C++ 中无效,您需要显式转换或使用enum.

myState尽管在 C 中可行,但设置为未由其类型定义的值(例如设置为 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 中应该可以,因为enums 是int)。

typedef struct {
    win_size_t current : 2;  // not tested
    win_size_t next : 2;
} state_t;

前面给出的解决方案当然是有效的。我的观点是,如果你的变量myState有你的enum Stateas 类型,它应该只使用成员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?
于 2011-02-07T14:24:29.983 回答
14

对枚举中的每个值使用不同的位,例如:

enum State 
{
  minimizing = 0x01, // 00000001
  maximizing = 0x02, // 00000010
  minimized  = 0x04, // 00000100
  maximized  = 0x08  // 00001000
}:

然后,您可以使用按位或 ( minimizing | maximized) 组合多个值,并使用按位和 ( ) 测试值bool is_minimized = (flags & minimized);

于 2011-02-07T11:38:31.190 回答
3

我刚刚在 VS2012 中尝试过,如果您使用位域,优化器似乎可以正确组合位而无需任何帮助。

struct BITS { int x: 1; int y:1; };

然后

BITS b;
b.x = b.y = 1;

用一条指令设置两个位。

于 2012-09-07T01:59:38.190 回答
2

您可以通过指定枚举中的所有字段并增加 2 的幂来获得此效果,以获得位掩码效果。例如,在您的情况下:

enum State
{
    minimizing = 1,
    maximizing = 2,

    minimized = 4,
    maximized = 8
};

所以你可以有你的组合(State.maximized | State.minimizing)。但是,这不会应用仅是State.maximizedor的限制State.minimized。如果你想这样做,你可以将它们转换为一个位,但我想在这个例子中你希望能够有一个既不最大化也不最小化的情况。

于 2011-02-07T11:36:01.137 回答