我试图了解有关此内容的更多信息以在我的项目中实现。
我目前基本上有这个:
unsigned char flags = 0; //8 bits
flags |= 0x2; //apply random flag
if(flags & 0x2) {
printf("Opt 2 set");
}
现在,我希望做一些更复杂的事情,我想要做的是应用三个标志,如下所示:
flags = (0x1 | 0x2 | 0x4);
然后从中删除标记
0x1
和0x2
?我以为可以做这样的事情,按位不(和按位AND来应用):flags &= ~(0x1 | 0x2);
显然,当我检查时,它们仍留在那儿或以某种方式保留。
我也不知道如何检查位标志中是否不存在它们(因此我无法检查以前的代码是否有效),会是这样吗?
if(flags & ~0x2)
printf("flag 2 not set");
我从最近的搜索中找不到任何适用于此的资源,我很乐意将此内容教给其他人,我真的很感兴趣。如果这令人困惑或简单,我深表歉意。
最佳答案
这是删除标志的正确方法。如果在该行之后添加printf("%d\n", flags)
,则输出应为4
。
不:
if ((flags & 0x2) == 0)
printf("flag 2 not set");
编辑:
要测试是否存在多个标志:
if ((flags & (0x1 | 0x2)) == (0x1 | 0x2))
printf("flags 1 and 2 are set\n");
要测试是否缺少多个标志,只需像以前一样将其与0进行比较:
if ((flags & (0x1 | 0x2)) == 0)
printf("flags 1 and 2 are not set (but maybe only one of them is!)\n");
关于c++ - 位标志的简单 bool 运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4191639/