位标志的简单布尔运算符

Joh*_*ohn 8 c c++ bitflags boolean-operations

我试图在我的项目中了解更多有关此内容的信息.

我目前基本上有这个:

unsigned char flags = 0; //8 bits

flags |= 0x2; //apply random flag

if(flags & 0x2) {
   printf("Opt 2 set");
}
Run Code Online (Sandbox Code Playgroud)

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

flags = (0x1 | 0x2 | 0x4);
Run Code Online (Sandbox Code Playgroud)

然后删除标志0x1,并0x2从它?我以为我可以做这样的事情应用按位NOT(和按位AND来应用它):

flags &= ~(0x1 | 0x2);
Run Code Online (Sandbox Code Playgroud)

显然,当我检查时,他们会留在那里或者某种方式.

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

if(flags & ~0x2) 
    printf("flag 2 not set");
Run Code Online (Sandbox Code Playgroud)

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

cdh*_*wie 22

从它删除两个?我以为我可以这样做:

flags &= ~(0x1 | 0x2);
Run Code Online (Sandbox Code Playgroud)

删除这两个标志,但显然它们仍然存在或某种方式.

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

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

if(flags & ~0x2) 
    printf("flag 2 not set");
Run Code Online (Sandbox Code Playgroud)

不:

if ((flags & 0x2) == 0)
    printf("flag 2 not set");
Run Code Online (Sandbox Code Playgroud)

编辑:

要测试是否存在多个标志:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2))
    printf("flags 1 and 2 are set\n");
Run Code Online (Sandbox Code Playgroud)

要测试缺少多个标志,只需像以前一样比较0:

if ((flags & (0x1 | 0x2)) == 0)
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n");
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 11

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

flags &= ~(0x1 | 0x2);
Run Code Online (Sandbox Code Playgroud)

是正确的方法.检查是否设置位的操作是:

if (!(flags & 0x2)) ...
Run Code Online (Sandbox Code Playgroud)

你拥有的那个:

if (flags & ~0x2) ...
Run Code Online (Sandbox Code Playgroud)

如果设置了任何其他位,则为true,这可能是清除操作无效的原因.问题不在于清算,而在于检查.

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

if ((flags & (0x2|0x1)) == 0x2|0x1) ...
Run Code Online (Sandbox Code Playgroud)