如何在 Java 中移除标志

2022-09-01 12:40:35

嗨,我需要删除Java中的标志。我有以下常量:

public final static int OPTION_A = 0x0001;
public final static int OPTION_B = 0x0002;
public final static int OPTION_C = 0x0004;
public final static int OPTION_D = 0x0008;
public final static int OPTION_E = 0x0010;
public final static int DEFAULT_OPTIONS =
       OPTION_A | OPTION_B | OPTION_C | OPTION_D | OPTION_E;

例如,我想从默认选项中删除OPTION_E。为什么下面的代码不正确?

// remove option E from defaul options:
int result = DEFATUL_OPTIONS;
result |= ~OPTION_E;

答案 1

|=执行按位,因此您有效地“添加”了除 之外的所有标志。您希望(按位)说您想要保留除以下以外的所有标志:OPTION_E&=OPTION_E

result &= ~OPTION_E;

但是,更好的方法是使用枚举和枚举集,从以下开始:

EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C,
                                     Option.D, Option.E);
options.remove(Option.E);

答案 2

你必须写

result &= ~OPTION_E;

更长的解释:

你必须从位思考:

~OPTION_E    // 0x0010 -> 0xFFEF
DEFATUL_OPTIONS //     -> 0x001F
0xFFEF | 0x001F //     -> 0xFFFF
0XFFEF & 0x001F //     -> 0x000F

永远不会清除位,它最多会设置更多。 另一方面会清除位。OR1AND


推荐