0

問題の解決策として「ビットセット」という言葉が頭に残っていますが、混乱しているかもしれません。

次のような特定の条件を示す16進値のリストがあります。

0x0001 = Outside
0x20000000 = Blah...

今、私はintを読んでいます。基本的に、intを既存のすべての16進条件と比較して、どれが一致するかを確認したいと思います。ゼロ、1、または多数に一致する可能性があります。

ビットセットは実際に私が欲しいものですか、それともそれを行うためのより簡単な方法がありますか?

これを聞くのは少しばかげていると思いますが、なだめるようなものが何と呼ばれているのか思い出せません!:)

どうもありがとう

4

3 に答える 3

1

ビットマスキングをお探しですか?これは、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の条件を設定できます。L1

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
}
于 2013-02-11T18:01:09.910 に答える
1

何が必要かは明確ではありませんが、Java SDK には BitSet と、BitSetを操作するための便利なメソッドが多数用意されています。あなたの場合、 and() と intersects() メソッドが役立つかもしれません。

于 2013-02-11T17:59:00.850 に答える
1

あなたが求めている言葉は「ビットマスク」だと思います

于 2013-02-11T17:59:11.027 に答える