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
从它删除两个?我以为我可以这样做:
Run Code Online (Sandbox Code Playgroud)flags &= ~(0x1 | 0x2);删除这两个标志,但显然它们仍然存在或某种方式.
这是删除标志的正确方法.如果你printf("%d\n", flags)在那一行之后,输出应该是4.
我也不知道如何检查它们是否存在于bit标志中(所以我无法检查我之前的代码是否有效),它会是这样的吗?
Run Code Online (Sandbox Code Playgroud)if(flags & ~0x2) printf("flag 2 not set");
不:
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)