Checking flag bits java
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.
Solution 5
Here is my Utility class what I'm using in my projects
public class FlagUtils {
// ------------------------------------------------------------------------
// TYPES
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// STATIC FIELDS
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// STATIC METHODS
// ------------------------------------------------------------------------
/**
* Sets the specified flags on the source int
*
* @param source the source int
* @param flag the flags which should be set
*
* @return the set int
*/
public static int setFlag(int source, int flag) {
return source | flag;
}
/**
* Un-sets the specified flags on the source int
*
* @param source the source int
* @param flag the flags which should be set
*
* @return the set int
*/
public static int unsetFlag(int source, int flag) {
return source & ~flag;
}
/**
* Check if the flags are set on the source ints
*
* @param source the source int
* @param flag the flags which should be set
*
* @return the set int
*/
public static boolean isFlagSet(int source, int flag) {
return (source & flag) == flag;
}
/**
* Flibs teh specified bit on the source
*
* @param source the source int
* @param flag the flags which should be set
*
* @return the set int
*/
public static int flip(int source, int flag) {
return source & ~flag;
}
/**
* Returns the masked int
*
* @param source the source int
* @param mask
*
* @return the set int
*/
public static int mask(int source, int mask) {
return source & mask;
}
// ------------------------------------------------------------------------
// FIELDS
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// CONSTRUCTORS
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// METHODS
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// GETTERS / SETTTERS
// ------------------------------------------------------------------------
}
Nagaraju
Updated on October 22, 2020Comments
-
Nagaraju over 3 years
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. -
Nagaraju almost 13 yearshere i don't have flags (like VALUE_TO_CHECK). i have another variable that contain some flags. so i need to find A contain all flags witch are present in B or not.
-
user207421 almost 13 years@Naga raju so please clarify your question.
-
pickypg almost 13 yearsIf you have a value with a bunch of flags set:
int A = flag1 | flag3 | flag15;
and you want to see if it has all of the values fromB
:int B = flag3 | flag15;
, thenB
isVALUE_TO_CHECK
in the above code:if (A & B == B)
(ignoring horrible variable names). Also, since it sounds like you are confused by this, you should reference trashgod's answer and buy the referenced book (by Josh Bloch). It's the best book to own as a Java developer. -
Cel about 11 yearsyou need another set of parentheses inside for it to compile, i.e. if ((value & VALUE_TO_CHECK) == VALUE_TO_CHECK), and same for (value & OTHER_VALUE_TO_CHECK)
-
Jimbali over 9 yearsCurly bracket on the next line in an
if
statement? shudders :P -
arkon about 9 years@Magicode That's not my particular style either, but it's extremely common. Not sure what you're shuddering about. I find it hard to believe you haven't encountered it countless times in snippets across the interwebs.
-
Jimbali about 9 yearsThose following different coding standards are evil and shall be eradicated!!! >:D
-
Suragch over 7 yearsHow do I use this to replace bit fields? I'm failing to make the jump.
-
trashgod over 7 yearsI'm not sure where you're having trouble; more examples may be found here.
-
AndroidKotlinNoob almost 3 yearsShouldn't it be
return (flags & value) == flags;
instead ofreturn (flags & value) == value;
?