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
时?@CinCouttrue
。这是因为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;
}