Checking flag bits java

I'm using the following:

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);
    }
}

However, if you don't need it "low-level" it's advised to use EnumSets instead for the added perk of type safety.


To check to see if a bit value is set:

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)
}

It's important to note that you should not have a checked value as 0 unless it represents All or None (and don't use bitwise logic to compare; just use value == 0) because any value & 0 is ALWAYS 0.


Also, consider using an EnumSet instead of bit fields. See also Bloch, Item 32.

Addendum: As a concrete example:

Enum sets also provide a rich, typesafe replacement for traditional bit flags:

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

Note in particular the convenient methods inherited from AbstractSet and AbstractCollection.


If you want to check if a has all flag bits in b set, you can check it as:

(a & b) == b