二进制标志:如何检查“1 必须有且 n 必须有 1”

问题描述 投票:0回答:1

我有一个可标记的枚举。

Flags
{
    None = 0
    A    = 1
    B    = 2
    C    = 4
    D    = 8
}

我有一个条件,我必须检查变量

flags
是否设置为
Flags.A
以及
Flags.B
Flags.C
Flags.D
中的至少一个。

当前最简单的方法是

if ( 
    ( flags == Flags.A | Flags.B )
    || ( flags == Flags.A | Flags.C )
    || ( flags == Flags.A | Flags.D )
)
{
}

我正在寻求一种方法来在一种情况下通过一次按位运算来检查它,而无需使用多个||操作。

类似这个(我尝试过但没有成功)

if ( flags == Flags.A | ( Flags.B | Flags.C | Flags.D ) )
{
}
bit-manipulation flags
1个回答
0
投票

首先,检查是否在值中设置了标志是使用

&
完成的,而不是使用
|
完成的。此外,您的条件是“标志A已设置并且B、CD之一”

所以会是这样的

if (flags & Flags.A && (flags & Flags.B || flags & Flags.C || flags && Flags.D))

根据您计划使用的语言,确切的语法可能会略有不同......

© www.soinside.com 2019 - 2024. All rights reserved.