web-dev-qa-db-ja.com

フラグビットのチェックjava

フラグビットに問題があります。フラグを保持するint変数があります。まず、その変数にいくつかのフラグを設定します。後で、その変数に設定されているフラグの数を確認する必要があります。しかし、私はそれをすることを知りません。

45
Nagaraju

ビット値が設定されているかどうかを確認するには:

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)
}

value == 0は常に0であるため、AllまたはNoneを表す(および比較にビット単位のロジックを使用せず、単にvalue & 0を使用する)場合を除き、チェック値を0にしてはならないことに注意することが重要です。

80
pickypg

また、ビットフィールドの代わりに EnumSet の使用を検討してください。 Bloch、Item 32 も参照してください。

補遺:具体的に

Enumセットは、従来のビットフラグの豊富で型保証された置換も提供します。

EnumSet.of(Style.BOLD, Style.ITALIC);

特に、AbstractSetおよびAbstractCollectionから継承された便利なメソッドに注意してください。

33
trashgod

abのすべてのフラグビットが設定されているかどうかを確認する場合は、次のように確認できます。

(a & b) == b
19
Ates Goral

私は次を使用しています:

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);
    }
}

ただし、 "低レベル"が必要ない場合は、タイプセーフの追加特典の代わりに EnumSets を使用することをお勧めします。

10
BullyWiiPlaza