2017-10-21 308 views
0

据堆栈溢出等问题,我们可以检查,如果一个位标志使用设置:标志 - 检查位设置,只有那些位设置

if(value & flag) 

Check if flag is set in integer variable

Checking for bit flags

C/C++ check if one bit is set in, i.e. int variable

但是,我想检查是否设置了特定的标志,如果只有构成那些f滞后。

static const uint64_t SOMEFLAG_0 = 0x0; 
static const uint64_t SOMEFLAG_1 = 0x1 << 0; 
static const uint64_t SOMEFLAG_2 = 0x1 << 1; 
static const uint64_t SOMEFLAG_3 = 0x1 << 2; 
static const uint64_t SOMEFLAG_4 = 0x1 << 3; 

我的尝试是:

if ((value & ~(SOMEFLAG_1 | SOMEFLAG_4)) == 0) 

然而,这不会在标志1设置和标志4未设置的情况下工作。我想测试它们是否都被设置,并且没有设置其他位。

如何以常规方式执行该测试? 也许我想XOR的价值和面具,做一些事情?

+0

'value == required_flags'? – navyblue

回答

3

有时候,最简单的答案在你把思想包裹在复杂的事情之后就没有了。

这是不够的:

if(value == flag) 

如果你需要检查多个标志:

if(value == (SOMEFLAG_1 | SOMEFLAG_4)) 
      ^     ^
      important    important 

而且不要忘了在括号括起来的位操作。优先级是意想不到的,没有它们,value == SOMEFLAG_1将首先被评估。


而且我想这是说教用于启用(和注意)编译器警告一个完美的时间:

铛有一个非常有用的包含在-Wall一个-Wparentheses

5::5:28:warning:|优先级低于==; ==将 评估第一[-Wparentheses]

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
    ~~~~~~~~~~~~~~~~~~~~^ 

5:5:28:注:围绕 '==' 表达 地方括号沉默此警告

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
        ^
    (    ) 

5: :5:28:注意:在|处放置括号表达 评估它首先

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
        ^
      (     ) 

GCC有也:

5:5:14:警告:在 操作数建议各地比较括号 '|' [-Wparentheses]

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
    ~~~~~~^~~~~~~~~~~~~ 
0

你几乎有它。它是:

if ((value & (SOMEFLAG_1 | SOMEFLAG_4)) == (SOMEFLAG_1 | SOMEFLAG_4)) 

当然这假设你不在乎什么SOMEFLAG2或3。如果这也是这种情况(你关心所有位),那么:

if (value == (SOMEFLAG_1 | SOMEFLAG_4))