c++ - 位掩码开关语句

标签 c++ switch-statement bitwise-operators bitmask bit-masks

我在项目的一部分中有这段代码:

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

所以我的问题是:

  • 我刚刚解决了我的问题吗?我想我有,但这是一个干净的解决方案吗?
  • 是否有更简单的方法来完成此任务?
  • 混合#defines 和函数是个坏主意吗?

  • 最佳答案

    不,这不是一个干净的解决方案,对于您的上下文,您可以避免混合使用 #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/

    相关文章:

    c++ - 将静态成员函数作为模板参数传递

    c++ - 你怎么 "break"跳出一个函数?

    c++ - 变量总是在函数中重置为默认值

    python - 给定N,返回满足方程: N + M = 2 * (N XOR M)的M

    c - 在 C 中,给定一系列字节,如何复制一个字节,然后复制该字节?

    c++ - 无法编译Qt Creator

    C++:gcc/g++ 编译器错误 logf 不是 std 的成员

    ios - 访问用户地址簿的权限警报不会停止执行

    c - 为什么我的 switch 语句打印 case 和 default?

    java - 反转 long 的字节顺序