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.
5 Answers
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.

- 22,034
- 5
- 72
- 84
-
here 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. – Nagaraju May 20 '11 at 04:27
-
2@Naga raju so please clarify your question. – user207421 May 20 '11 at 04:35
-
1If 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 from `B`: `int B = flag3 | flag15;`, then `B` _is_ `VALUE_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. – pickypg May 20 '11 at 04:37
-
1you 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) – Cel May 10 '13 at 14:56
-
Curly bracket on the next line in an `if` statement? *shudders* :P – Jimbali Dec 24 '14 at 18:03
-
@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. – arkon Mar 08 '15 at 06:22
-
Those following different coding standards are evil and shall be eradicated!!! >:D – Jimbali Mar 09 '15 at 15:20
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
.

- 203,806
- 29
- 246
- 1,045
-
How do I use this to replace bit fields? I'm failing to make the jump. – Suragch Feb 11 '17 at 09:20
-
I'm not sure where you're having trouble; more examples may be found [here](http://stackoverflow.com/search?tab=votes&q=%5bjava%5d%20EnumSet%20bit%20field). – trashgod Feb 11 '17 at 10:18
If you want to check if a
has all flag bits in b
set, you can check it as:
(a & b) == b

- 12,062
- 4
- 64
- 92

- 137,716
- 26
- 137
- 190
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.

- 17,329
- 10
- 113
- 185
-
Shouldn't it be `return (flags & value) == flags;` instead of `return (flags & value) == value;`? – AndroidKotlinNoob Jun 28 '21 at 17:29
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
// ------------------------------------------------------------------------
}

- 507
- 1
- 5
- 10