C++的位屏蔽?

Suz*_*dın -2 c++ byte set bit

我有一个类型为uint8的标志,我希望检查十进制值是什么.我不需要这样的价值,但我需要知道它的结果,所以我可以从那里工作.

我有几个选择,所以说我们有这个

0x01 = Hello
0x02 = Goodbye
0x04 = Morning
Run Code Online (Sandbox Code Playgroud)

假设我们正在测试的变量被调用我怎样才能检查mybyte是否包含"Goodbye"和"Morning"?

任何帮助,将不胜感激.谢谢.

cdh*_*wie 5

像这样的东西应该做的伎俩:

enum WordMask
{
    Hello = 0x01,
    Goodbye = 0x02,
    Morning = 0x04
};
Run Code Online (Sandbox Code Playgroud)

现在,检查一个值是否包含标志GoodbyeMorning(它不关心是否Hello设置):

if ((value & (Goodbye | Morning)) == (Goodbye | Morning)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您可以对此进行概括,以便您不必重复两次标记:

template <typename T>
bool are_all_flags_set(T value, T flags)
{
    return (value & flags) == flags;
}
Run Code Online (Sandbox Code Playgroud)

然后你的情况变成:

if (are_all_flags_set(value, Goodbye | Morning)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)