检查标志位Java

我有一个标志位的问题。 我有一个intvariables来保存标志。 首先,我为这个variables设置了一些标志。 后来我需要检查在variables中设置了多less个标志。 但我不知道这样做。

要检查是否设置了一个位值:

 int value = VALUE_TO_CHECK | OTHER_VALUE_TO_CHECK; if ((value & VALUE_TO_CHECK) == VALUE_TO_CHECK) { // do something--it was set } if ((value & OTHER_VALUE_TO_CHECK) == OTHER_VALUE_TO_CHECK) { // also set (if it gets in here, then it was defined in // value, but it does not guarantee that it was set with // OR without other values. To guarantee it's only this // value just use == without bitwise logic) } 

重要的是要注意,除非它代表All或None(不要使用按位逻辑来进行比较;只是使用value == 0 ),否则不应该将检查值设置为0,因为任何value & 0始终为0。

另外,请考虑使用EnumSet而不是位域。 另见Bloch,第32项 。

附录:作为一个具体的例子 :

枚举集也提供了一个丰富的,types安全的替代传统的位标志:

 EnumSet.of(Style.BOLD, Style.ITALIC); 

特别注意从AbstractSetAbstractCollectioninheritance的便捷方法。

如果你想检查b集中是否有所有的标志位,你可以检查它:

 (a & b) == b 

我正在使用以下内容:

 public class BitFlags { public static boolean isFlagSet(byte value, byte flags) { return (flags & value) == value; } public static byte setFlag(byte value, byte flags) { return (byte) (flags | value); } public static byte unsetFlag(byte value, byte flags) { return (byte) (flags & ~value); } } 

但是,如果您不需要“低级别”,则build议使用EnumSets代替types安全性的附加安全性。