使用二进制标志来表示状态,选项等

时间:2009-09-10 19:20:46

标签: c++ binary flags

如果我想使用二进制“flags”表示状态或选项或类似内容,以便我可以传递它们并将它们存储到像OPTION1 | OPTION2 OPTION1其中OPTION2enum Option { Option_1 = 0x01, Option_2 = 0x02, Option_3 = 0x04, //... } void doSomething(Option options) { //... } int main() { doSomething(Option_1|Option_2); } 的对象中}是0010,所以传递的是0011,表示选项的混合。

我将如何在C ++中执行此操作?我在想像

doSomething

但理想情况下,Option知道如何解释给定的选项。

我是否在正确的轨道上?有没有更好的办法?

更新

我不是必须为每种可能的组合定义{{1}}吗?

4 个答案:

答案 0 :(得分:6)

这是完成这些事情的常见方式。 doSomething可以使用按位and运算符来查看是否选择了某个选项:

if (options & Option_1){ 
  // option 1 is selected
}

或者,您可以考虑使用bit fields

struct Options {
    unsigned char Option_1 : 1;
    unsigned char Option_2 : 1;
};

Options o;
o.Option_1 = 1;
o.Option_2 = 0;

答案 1 :(得分:4)

这就是我做的方式。但是,您可以使用许多技巧使枚举更具可读性:

enum Option {
    Option1 = 1 /*<< 0*/,
    Option2 = 1 << 1,
    Option3 = 1 << 2,
    // etc.
};

此外,您还需要为枚举指定按位运算符。考虑像ASL's enum_ops实用程序这样的东西来帮助解决这个问题。

答案 2 :(得分:3)

值得注意的是,人们通常使用这种标志的方式是定义函数如下:

void doSomething( unsigned int options ) 
{
    //...
}

其他一切将完全按照您的意愿运作:)

另一种方法是创建自己的“Flags”类。然后你在课堂上有以下几个函数:

bool GetOption( Option option )
{
    return (m_Option & option) > 0;
}

void SetOption( Option option )
{
    m_Option |= option;
}

void ClearOption( Option option )
{
    m_Option &= ~option;
}

甚至超载操作员完全按照您的意愿执行操作:

Flags( unsigned int options ) :
   m_Option( options )
{
}

Flags operator|( const Flags& flags )
{
    return Flags( m_Option | flags.m_Option );
}

等等。

答案 3 :(得分:1)

您可能想查看stl bitset。有些人会鼓吹你应该总是使用那些而不是C风格的bitflags。但是,这两种解决方案都很好IMO。