我在项目的一部分中有这段代码:
enum myEnum
{
invalid = -1,
val1 = 1,
val2 = 2,
val3 = 4
};
int bitmask = val1 | val3;
if(bitmask & val1)
...
if(bitmask & val2)
...
if(bitmask & val3)
...
这很好,而且效果很好,但我一直想知道是否可以通过开关来完成。我在想这样的事情:
int checkMask(int& mask)
{
for(int i = 0; mask; mask &= ~(1 << i++))
{
if(mask & (1 << i))
{
int ret = mask & (1 << i);
mask &= ~ret;
return ret;
}
}
return invalid;
}
#define START_BITMASK_SWITCH(x) int xcopy = x; while(xcopy) { switch(checkMask(xcopy))
#define END_BITMASK_SWITCH };
int bitmask = val1 | val3;
START_BITMASK_SWITCH(bitmask)
{
case val1:
...
break;
case val2:
...
break;
case val3:
...
break;
}
END_BITMASK_SWITCH
所以我的问题是:
最佳答案
不,这不是一个干净的解决方案,对于您的上下文,您可以避免混合使用 #define
和函数。如果你想要 switch()
,你可以尝试下面的解决方案:
int bitmask = val1 | val3;
int mask = 1;
while(bitmask)
{
switch(bitmask & mask)
{
case val1: ... break;
case val2: ... break;
case val4: ... break;
case val8: ... break;
}
bitmask &= ~mask;
mask <<= 1;
}
关于c++ - 位掩码开关语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6607627/