处理多个标志案例
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))
更干净的方法是为标志位掩码定义宏或常量,并使用这些宏,而不是普通的十六进制位掩码。
相关文章:
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 在轮班操作后使用携带标志
- 如何找出引入AVX标志的内容
- I2C 文件描述符上的 I2C 总线可写/可读标志
- C ++是否有C ++ 17 OSX 10.13.6的标志
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- CMake 3.5 中的链接器标志位置
- 如何使用 gnu gcc 标志 -mpc32、-mpc64 和 -mpc80?
- 在 CMake 中添加全局编译标志
- -Wlifetime 标志的目的是什么?
- Visual Studio 19-17 库兼容性根据 GL 标志
- 标志 |= f == s[i],这个语句会做什么?
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 处理多个标志案例