8

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

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

unsigned char flags = 0; //8 bits

flags |= 0x2; //apply random flag

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

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

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

然后删除标志0x10x2从中删除?我想我可以做这样的事情,应用按位非(和按位与应用它):

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

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

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

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

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

4

2 回答 2

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");
于 2010-11-16T06:19:59.527 回答
11

我不知道你为什么认为清除操作不起作用。

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

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

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

你拥有的那个:

if (flags & ~0x2) ...

如果设置了任何其他位,则为真,这可能就是您认为清除操作不起作用的原因。问题不在于清理,而在于检查。

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

if ((flags & (0x2|0x1)) == 0x2|0x1) ...
于 2010-11-16T06:20:41.780 回答