フラグビットに問題があります。フラグを保持するint
変数があります。まず、その変数にいくつかのフラグを設定します。後で、その変数に設定されているフラグの数を確認する必要があります。しかし、私はそれをすることを知りません。
ビット値が設定されているかどうかを確認するには:
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にしてはならないことに注意することが重要です。
また、ビットフィールドの代わりに EnumSet
の使用を検討してください。 Bloch、Item 32 も参照してください。
補遺:具体的に 例 :
Enumセットは、従来のビットフラグの豊富で型保証された置換も提供します。
EnumSet.of(Style.BOLD, Style.ITALIC);
特に、AbstractSet
およびAbstractCollection
から継承された便利なメソッドに注意してください。
a
にb
のすべてのフラグビットが設定されているかどうかを確認する場合は、次のように確認できます。
(a & b) == b
私は次を使用しています:
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
を使用することをお勧めします。