gpt4 book ai didi

c++ - Flags - 检查是否设置了位并且只设置了那些位

转载 作者:行者123 更新时间:2023-11-27 23:50:24 25 4
gpt4 key购买 nike

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

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

最佳答案

有时,当您的思绪被复杂的事物所包围后,最简单的答案就会让您望而却步。

这就够了:

if(value == flag)

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

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

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


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

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

5 : :5:28: warning: | has lower precedence than ==; == will be evaluated first [-Wparentheses]

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

5 : :5:28: note: place parentheses around the '==' expression to silence this warning

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

5 : :5:28: note: place parentheses around the | expression to evaluate it first

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

gcc 也有:

5 : :5:14: warning: suggest parentheses around comparison in operand of '|' [-Wparentheses]

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

关于c++ - Flags - 检查是否设置了位并且只设置了那些位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46866399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com