位标志的简单布尔运算符

时间:2010-11-16 06:16:09

标签: c++ c boolean-operations bitflags

我正试图在我的项目中了解更多相关信息。

我目前基本上已经得到了这个:

unsigned char flags = 0; //8 bits

flags |= 0x2; //apply random flag

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

现在我希望做一些更复杂的事情,我想要做的就是应用这样的三个标志:

flags = (0x1 | 0x2 | 0x4);

然后从中删除标记0x10x2?我认为我可以做这样的事情,应用按位NOT(和按位AND来应用它):

flags &= ~(0x1 | 0x2);

显然,当我检查时,他们会留在那里或其他任何方式。

我也不知道如何检查它们是否存在于位标志中(所以我无法检查我之前的代码是否有效),它会是这样的吗?

if(flags & ~0x2) 
    printf("flag 2 not set");

我无法从我最近的搜索中找到适用于此的任何资源,我愿意学习这些来教别人,我真的很感兴趣。如果这令人困惑或简单,我道歉。

2 个答案:

答案 0 :(得分:22)

  

从中移除两个?我想   我可以这样做:

flags &= ~(0x1 | 0x2);
     

删除这两个标志,但是   显然他们留在那里或   无论哪种方式。

这是删除标志的正确方法。如果您在该行之后printf("%d\n", flags),则输出应为4

  

我也不知道如何检查   它们不存在于位标志中(所以   我无法检查我以前的代码   它会是什么样的   此?

if(flags & ~0x2) 
    printf("flag 2 not set");

都能跟得上:

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");

答案 1 :(得分:11)

我不确定为什么你认为清算操作不起作用。

flags &= ~(0x1 | 0x2);

是正确的方法。检查未设置位的操作是:

if (!(flags & 0x2)) ...

你拥有的那个:

if (flags & ~0x2) ...
如果设置了任何其他位,则

将为true,这可能是清除操作无效的原因。问题不在于清算,而在于检查。

如果要检查组中的所有位是否已设置:

if ((flags & (0x2|0x1)) == 0x2|0x1) ...