Nag*_*aju 45 java flags bit-manipulation
我有标志位的问题.我有一个int变量来保存标志.首先,我为该变量设置了一些标志.后来我需要检查该变量中设置了多少个标志.但我不知道这样做.
pic*_*ypg 80
要检查是否设置了位值:
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)
}
Run Code Online (Sandbox Code Playgroud)
重要的是要注意,除非它表示全部或无(并且不使用按位逻辑进行比较;只是使用value == 0),否则不应将检查值设置为0,因为任何value & 0值始终为0.
tra*_*god 33
另外,请考虑使用EnumSet而不是位字段.另见Bloch,第32项.
附录:作为一个具体的例子:
枚举集还为传统位标志提供了丰富的,类型安全的替代:
EnumSet.of(Style.BOLD, Style.ITALIC);
Run Code Online (Sandbox Code Playgroud)
特别注意从AbstractSet和继承的方便方法AbstractCollection.
Bul*_*aza 10
我正在使用以下内容:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您不需要它"低级别",建议使用EnumSets相应的类型安全额外补贴.