标志 - 检查位是否已设置且仅设置了这些位

时间:2017-10-21 18:06:08

标签: c++ bit-manipulation

根据Stack Overflow上的其他问题,我们可以使用以下方法检查是否设置了位标志:

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

但是,我想检查是否设置了特定的标志,以及是否只设置了组成这些标志的位。

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。我想测试是否已设置并且没有设置其他位。

如何以传统方式执行该测试? 也许我想对价值和面具进行异或并做一些事情?

2 个答案:

答案 0 :(得分:3)

有时最简单的答案就是在你的思想被包裹在复杂的事物中之后就会出现。

这就够了:

if(value == flag)

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

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

不要忘记将括号操作括在括号中。优先级是意外的,没有它们value == SOMEFLAG_1将首先进行评估。

我想这是宣传启用(并关注)编译器警告的最佳时机:

clang有一个非常有用的-Wparentheses,其中包含-Wall

  

5 :: 5:28:警告:|优先级低于==; ==会的   首先评估[-Whatarentheses]

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)
    ~~~~~~^~~~~~~~~~~~~

答案 1 :(得分:0)

你几乎拥有它。它是:

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

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

if (value == (SOMEFLAG_1 | SOMEFLAG_4))