Checking flag bits java

41,049

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

}

Share:
41,049
Nagaraju
Author by

Nagaraju

Updated on October 22, 2020

Comments

  • Nagaraju
    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
    Nagaraju almost 13 years
    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.
  • user207421
    user207421 almost 13 years
    @Naga raju so please clarify your question.
  • pickypg
    pickypg almost 13 years
    If 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.
  • Cel
    Cel about 11 years
    you 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
    Jimbali over 9 years
    Curly bracket on the next line in an if statement? shudders :P
  • arkon
    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
    Jimbali about 9 years
    Those following different coding standards are evil and shall be eradicated!!! >:D
  • Suragch
    Suragch over 7 years
    How do I use this to replace bit fields? I'm failing to make the jump.
  • trashgod
    trashgod over 7 years
    I'm not sure where you're having trouble; more examples may be found here.
  • AndroidKotlinNoob
    AndroidKotlinNoob almost 3 years
    Shouldn't it be return (flags & value) == flags; instead of return (flags & value) == value;?