C ++的位屏蔽?

时间:2014-08-19 20:51:44

标签: c++ set byte bit

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

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

0x01 = Hello
0x02 = Goodbye
0x04 = Morning

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

任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:5)

这样的事情可以解决问题:

enum WordMask
{
    Hello = 0x01,
    Goodbye = 0x02,
    Morning = 0x04
};

现在,要检查某个值是否包含标记GoodbyeMorning(它不关心是否设置了Hello):

if ((value & (Goodbye | Morning)) == (Goodbye | Morning)) {
    // ...
}

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

template <typename T>
bool are_all_flags_set(T value, T flags)
{
    return (value & flags) == flags;
}

然后你的情况变成:

if (are_all_flags_set(value, Goodbye | Morning)) {
    // ...
}

答案 1 :(得分:0)

旗帜的定义应该是其他方式,因为您正在尝试

enum MyOptions {
     Hello = 0x01 ,
     Goodbye = 0x02 ,
     Morning = 0x04 ,
};

答案 2 :(得分:0)

例如,您可以按照以下方法

#include <iostream>
#include <iomanip>
#include <cstdint>

enum Flags : uint8_t
{
    Hello  = 0x1,
    Goodbye = 0x2,
    Morning = 0x4
};

inline bool IsSet( uint8_t value, uint8_t f )
{
    return ( value & f ) == f;  
}

int main() 
{
    uint8_t mybyte = Goodbye | Morning;

    std::cout << std::boolalpha << IsSet( mybyte, Goodbye | Morning ) << std::endl;
    std::cout << std::boolalpha << IsSet( mybyte, Hello ) << std::endl;


    return 0;
}

输出

true
false