我想知道如何最好地处理多个标志情况,例如我需要检查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) {}
答案 0 :(得分:2)
您可以将标志转换为单个位并对它们执行二进制操作。
假设有五个标志:a
,b
,c
,d
和e
。
所有标志的有效值为0x1
和0x0
。
转换为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;
整个转化过程可以简化为循环。
现在您可以方便地与特定位掩码进行比较。
要检查是否设置了a
和b
,请使用
if (flags & (0x1 + 0x2))
要检查是否设置了b
和f
,请使用
if (flags & (0x2 + 0x20))
更简洁的方法是为标志位掩码定义宏或常量并使用这些宏,而不是普通的十六进制位掩码。