Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查位枚举中是否存在值?_C++_Enums_Bit Manipulation - Fatal编程技术网

C++ 如何检查位枚举中是否存在值?

C++ 如何检查位枚举中是否存在值?,c++,enums,bit-manipulation,C++,Enums,Bit Manipulation,我有一个枚举: enum Rule { BIT_NONE, BIT_ONE, BIT_TWO = 1 << 1, BIT_THREE = 1 << 2, BIT_FOUR = 1 << 3 }; enum规则 { 一点也没有, 第一位, BIT_TWO=1这需要一些位操作技巧: 要允许所有enum作为一个位,您需要确保它小于bit\u FOUR,并且它只是一个位。后者可以通过!((val-1)&val)检测: 最后,我

我有一个
枚举

enum Rule
{
    BIT_NONE,
    BIT_ONE,
    BIT_TWO = 1 << 1,
    BIT_THREE = 1 << 2,
    BIT_FOUR = 1 << 3
};
enum规则
{
一点也没有,
第一位,

BIT_TWO=1这需要一些位操作技巧:

要允许所有
enum
作为一个位,您需要确保它小于
bit\u FOUR
,并且它只是一个位。后者可以通过
!((val-1)&val)
检测:

最后,我们得到:

bool is_allowed(unsigned val) {
    return is_allowed_single(val) || is_allowed_combination(val);
}

因为枚举很小,所以还有另一种方法:使用所有有效值的预定义掩码。
该掩码是
1的OR。您通常通过使用按位OR仔细创建掩码来检查位,然后按按位and检查值。但在这种情况下,将有4个掩码,我需要全部键入它们吗,还是有其他方法。枚举
将在将来增长,每次维护该掩码列表都将是一件痛苦的事情!您同意吗使用
std::bitset
?@diametralpitch遗留代码;更改不可行是的,它可能需要多个掩码和多个按位and,但对于遗留代码,您必须在它创建的受限墙内工作。要么这样做,要么进行重大重构。为了使其更容易,将条件分解为函数,因此您必须单个函数检查例如您提到的值。至少这样,如果添加更多位或需要更改掩码,在单个位置修改会更容易。在
中发生的是\u allowed\u single()
val
0
时?@CinCout
true
。这是因为
val-1
将被包装成
UNSIGNED\u MAX
?@CinCout是。
UNSIGNED
算术总是被定义的。哦,是的。UB代表
signed
。我总是把两者混淆。
bool is_allowed_combination(unsigned val) {
    return !(val & ~(BIT_TWO|BIT_THREE|BIT_FOUR));
}
bool is_allowed(unsigned val) {
    return is_allowed_single(val) || is_allowed_combination(val);
}
bool is_allowed(unsigned val) {
    return (0x5557 & (1 << val)) != 0;
}