标志 - 检查是不是设置了位并且仅设置了这些位

Posted

技术标签:

【中文标题】标志 - 检查是不是设置了位并且仅设置了这些位【英文标题】:Flags - Check if bits are set and only those bits are set标志 - 检查是否设置了位并且仅设置了这些位 【发布时间】:2017-10-21 18:06:08 【问题描述】:

根据 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 的情况下,这将不起作用。我想测试是否都设置了并且没有设置其他位。

如何以传统方式执行该测试? 也许我想对值和掩码进行异或运算并做点什么?

【问题讨论】:

value == required_flags 怎么样? 【参考方案1】:

有时,最简单的答案会在你被复杂的事情缠住之后不知所措。

这就够了:

if(value == flag)

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

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

并且不要忘记将按位运算括在括号中。优先级是出乎意料的,没有它们value == SOMEFLAG_1 将首先被评估。


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

clang 有一个非常有用的-Wparentheses,它包含在-Wall 中:

5 : :5:28: 警告:|优先级低于 ==; == 将是 评估第一个 [-W括号]

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: 警告:建议在比较中使用括号 '|' 的操作数[-括号]

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

【讨论】:

【参考方案2】:

你几乎拥有它。它是:

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

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

if (value == (SOMEFLAG_1 | SOMEFLAG_4))

【讨论】:

以上是关于标志 - 检查是不是设置了位并且仅设置了这些位的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 linux 在 ntfs-3g 分区中取消设置文件的稀疏标志?

Gradle 任务检查是不是定义了属性

python Events

RFC3489 STUN之客户端所处环境探测流程与部分属性含义说明

外部中断标志位清除不了

登录操作(方法一:设置flag标志位)