我正试图在我的项目中了解更多相关信息。
我目前基本上已经得到了这个:
unsigned char flags = 0; //8 bits
flags |= 0x2; //apply random flag
if(flags & 0x2) {
printf("Opt 2 set");
}
现在我希望做一些更复杂的事情,我想要做的就是应用这样的三个标志:
flags = (0x1 | 0x2 | 0x4);
然后从中删除标记0x1
和0x2
?我认为我可以做这样的事情,应用按位NOT(和按位AND来应用它):
flags &= ~(0x1 | 0x2);
显然,当我检查时,他们会留在那里或其他任何方式。
我也不知道如何检查它们是否存在于位标志中(所以我无法检查我之前的代码是否有效),它会是这样的吗?
if(flags & ~0x2)
printf("flag 2 not set");
我无法从我最近的搜索中找到适用于此的任何资源,我愿意学习这些来教别人,我真的很感兴趣。如果这令人困惑或简单,我道歉。
答案 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) ...