ビットマスキングをお探しですか?これは、anの各ビットがint
ブール値を表し、set(1はtrueを意味します)およびunset(0、falseを意味します)です。例えば:
public class MaskingExample {
private static final int OUTSIDE_MASK = 1; // Right-most bit
private static final int HEATED_MASK = 1 << 1; // Second-to-right-most bit
private static final int WET_MASK = 1 << 2; // Third-to-right-most bit
private int value = 0;
public boolean isOutside() {
return isBitSet(OUTSIDE_MASK, value);
}
public void setOutside(boolean outside) {
value = outside ? setBit(OUTSIDE_MASK, value) : unsetBit(OUTSIDE_MASK, value);
}
// Other setters and getters
private static int setBit(int mask, int value) {
return value | mask;
}
private static int unsetBit(int mask, int value) {
return value & ~mask;
}
private static boolean isBitSet(int mask, int value) {
return (value & mask) == mask;
}
}
32を超える条件が必要な場合はlong
、すべてのマスクとを使用し、シフトされる各値にvalue
を追加すると、次のように最大64の条件を設定できます。L
1
private static final long OUTSIDE_MASK = 1L; // Right-most bit
private static final long HEATED_MASK = 1L << 1; // Second-to-right-most bit
private static final long WET_MASK = 1L << 2; // Third-to-right-most bit
private long value = 0;
ちなみに、一度に複数のビットを設定することもできます。以下を使用して、マスクを1つのマスクに結合します&
。
public void setOutsideAndRaining(boolean outsideAndRaining) {
int comboMask = OUTSIDE_MASK & WET_MASK;
value = outsideAndRaining ? setBit(comboMask, value) : unsetBit(comboMask, value);
}
編集:以下のkaliatechの回答を見た後、を使用することもできますBitSet
。解決策は非常に似ていますが、数学ロジックはBitSet
オブジェクトにカプセル化されており、任意の数のビットを使用できるため、64に制限されません。
public class MaskingExample {
private static final int OUTSIDE_POSITION = 0;
private static final int HEATED_POSITION = 1;
private static final int WET_POSITION = 2;
private static final int TOTAL_CONDITIONS = 3;
private BitSet bitSet = new BitSet(TOTAL_CONDITIONS);
public boolean isOutside() {
return bitSet.get(OUTSIDE_POSITION);
}
public void setOutside(boolean outside) {
bitSet.set(OUTSIDE_POSITION, outside);
}
// Other setters and getters
}