您好我需要删除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;
答案 0 :(得分:45)
|=
执行按位或,因此您可以有效地“添加”OPTION_E
以外的所有标志。您希望&=
(按位和)表示您希望保留除OPTION_E
以外的所有标志:
result &= ~OPTION_E;
但是,更好的方法是使用枚举和EnumSet
开头:
EnumSet<Option> options = EnumSet.of(Option.A, Option.B, Option.C,
Option.D, Option.E);
options.remove(Option.E);
答案 1 :(得分:10)
你必须写
result &= ~OPTION_E;
更长的解释:
你必须考虑一下:
~OPTION_E // 0x0010 -> 0xFFEF
DEFATUL_OPTIONS // -> 0x001F
0xFFEF | 0x001F // -> 0xFFFF
0XFFEF & 0x001F // -> 0x000F
OR
永远不会清除1
位,它最多会设置更多位。
另一方面,AND
将清除位。
答案 2 :(得分:6)
您应该使用and
运算符代替or
:
result &= ~OPTION_E;
考虑它的一种方法是|=
设置位,而&=
清除位:
result |= 1; // set the least-significant bit
result &= ~1; // clear the least-significant bit