处理多个标志案例
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) {}
您可以将标志转换为单个位并对其执行二进制运算。
假设有五个标志: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))
更简洁的方法是为标志位掩码定义宏或常量并使用这些宏,而不是普通的十六进制位掩码。
我想知道如何最好地处理多个标志情况,例如我需要检查 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) {}
您可以将标志转换为单个位并对其执行二进制运算。
假设有五个标志: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))
更简洁的方法是为标志位掩码定义宏或常量并使用这些宏,而不是普通的十六进制位掩码。