标志 - 检查是不是设置了位并且仅设置了这些位
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 分区中取消设置文件的稀疏标志?