Checking flag bits java
I have a problem with flag bits.
I have an int
variable to hold flags. First I set some flags to that variable. Later I need check how many flags were set in that variable. But I don't know to do it.
Solution 1:
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.
Solution 2:
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
.
Solution 3:
If you want to check if a
has all flag bits in b
set, you can check it as:
(a & b) == b
Solution 4:
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.