我有一个类型为uint8的标志,我希望检查十进制值是什么。我不需要这样的价值,但我需要知道它的结果,所以我可以在那里工作。
我有几个选择,所以说我们有这个
0x01 = Hello
0x02 = Goodbye
0x04 = Morning
说我们正在测试的变量被调用我怎样才能检查mybyte是否包含“Goodbye”和“Morning”?
任何帮助将不胜感激。感谢。
答案 0 :(得分:5)
这样的事情可以解决问题:
enum WordMask
{
Hello = 0x01,
Goodbye = 0x02,
Morning = 0x04
};
现在,要检查某个值是否包含标记Goodbye
和Morning
(它不关心是否设置了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