Checking flag bits java

JavaBit ManipulationFlags

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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 - Java

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 - Java

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

(a & b) == b

Solution 4 - 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.

Solution 5 - Java

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
// ------------------------------------------------------------------------

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNagarajuView Question on Stackoverflow
Solution 1 - JavapickypgView Answer on Stackoverflow
Solution 2 - JavatrashgodView Answer on Stackoverflow
Solution 3 - JavaAtes GoralView Answer on Stackoverflow
Solution 4 - JavaBullyWiiPlazaView Answer on Stackoverflow
Solution 5 - JavaSzabolcs BeczeView Answer on Stackoverflow