我试图了解有关此内容的更多信息以在我的项目中实现。

我目前基本上有这个:

unsigned char flags = 0; //8 bits

flags |= 0x2; //apply random flag

if(flags & 0x2) {
   printf("Opt 2 set");
}

现在,我希望做一些更复杂的事情,我想要做的是应用三个标志,如下所示:
flags = (0x1 | 0x2 | 0x4);

然后从中删除标记0x10x2?我以为可以做这样的事情,按位不(和按位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/

10-10 18:29
查看更多