处理多个旗帜案件

时间:2015-12-04 20:02:11

标签: java c++ performance flags

我想知道如何最好地处理多个标志情况,例如我需要检查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) {}

1 个答案:

答案 0 :(得分:2)

您可以将标志转换为单个位并对它们执行二进制操作。

假设有五个标志: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))
    

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