本文旨在解决C/C++中处理枚举的if else
嵌套问题。假设我们有如下的enum
定义:
enum {
PSEUDO_COLOR_IRON_BOW = 0,
PSEUDO_COLOR_WHITE_HOT,
PSEUDO_COLOR_BLACK_HOT,
PSEUDO_COLOR_RAINBOW,
PSEUDO_COLOR_RAINBOW_HC,
PSEUDO_COLOR_IRON_BOW_F8,
PSEUDO_COLOR_IRON_BOW_F10,
PSEUDO_COLOR_NUMS,
};
如果我们想要实现如下的判断:
if (param in PSEUDO_COLOR_NUMS)
那我们使用的方法无法是:if else
的嵌套、一个if
中多个or
、switch
和映射
。但对于这种连续的enum来说,我们可以使用位移来进行一个简单的判断。
假设我们最大枚举到了6
,需要判断的数是data
。我们可以设置一个0b 0111 1111
,使1 < data
,然后将其进行与操作,以判断1
是否被左移出区间。代码如下:
const uint8_t VALID_PSEUDO_COLORS = 0b01111111;
if (VALID_PSEUDO_COLORS & (1 << data))
{
// pseudo_color = data;
}
else
{
return error;
}
进一步的,如果我们PSEUDO_COLOR_NUMS = 10
,那么我们需要让VALID_PSEUDO_COLORS
的低10+1
位都为1,高位都为0,即可比较。我们进一步地可以将程序写为:
const uint16_t VALID_PSEUDO_COLORS = (1 << PSEUDO_COLOR_NUMS) - 1;
Comments | NOTHING