处理多个标志案例

Dealing with Multiple Flag Cases

我想知道如何最好地处理多个标志情况,例如我需要检查 5 个标志:t d y r g 我需要检查所有此类标志的情况。什么是更好的方法而不是

if(t && d && y && r && g) {}
else if(t && d && y && r) {}
else if(t && d && y && g) {}
....
else if(t) {}
else if(d) {}

您可以将标志转换为单个位并对其执行二进制运算。

假设有五个标志:abcde
所有标志的有效值为 0x10x0.

  1. 转换为uint8_t:

    uint8_t flags;
    flags |= a;
    flags |= b << 0x1;
    flags |= c << 0x2;
    flags |= d << 0x3;
    flags |= e << 0x4;
    flags |= f << 0x5;
    

    如果您从一开始就将所有标志存储在一个数组中,并通过宏将它们表示为索引,如下所示:

    #define IGNORE_CASE 0x0
    ...
    
    bool flag_array[NUM_FLAGS];
    
    flag_array[IGNORE_CASE] = SOME_VALUE;
    

    整个转换过程可以简化为一个循环。

  2. 现在您可以方便地与特定位掩码进行比较。

    要检查是否设置了 ab,请使用

    if (flags & (0x1 + 0x2))
    

    要检查是否设置了 bf,请使用

    if (flags & (0x2 + 0x20))
    

    更简洁的方法是为标志位掩码定义宏或常量并使用这些宏,而不是普通的十六进制位掩码。