检查标志位java

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.

  • @Naga raju所以请澄清你的问题. (2认同)

tra*_*god 33

另外,请考虑使用EnumSet而不是位字段.另见Bloch,第32项.

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

枚举集还为传统位标志提供了丰富的,类型安全的替代:

EnumSet.of(Style.BOLD, Style.ITALIC);
Run Code Online (Sandbox Code Playgroud)

特别注意从AbstractSet和继承的方便方法AbstractCollection.


Ate*_*ral 19

如果要检查是否ab设置所有标志位,可以将其检查为:

(a & b) == b
Run Code Online (Sandbox Code Playgroud)


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相应的类型安全额外补贴.