0

作为解决问题的方法,我脑子里一直有“bitset”这个词,但我想我可能会让自己感到困惑。

我有一个指示某些条件的十六进制值列表,例如:

0x0001 = Outside
0x20000000 = Blah...

现在我正在读取一个 int,我基本上想将 int 与所有现有的十六进制条件进行比较,以查看它与哪个匹配。它可以匹配零个、一个或多个。

bitset 实际上是我想要的,还是有更简单的方法?

问这个我觉得有点傻,但我不记得这该死的东西叫什么了!:)

非常感谢

4

3 回答 3

1

不清楚您想要什么,但 Java SDK 确实提供了一个BitSet,以及许多使用 BitSet 的有用方法。在您的情况下, and() 和 intersects() 方法可能有用。

于 2013-02-11T17:59:00.850 回答
1

我认为您所追求的词是“位掩码”

于 2013-02-11T17:59:11.027 回答
1

您在寻找位掩码吗?这就是 an 中的每个位int表示一个布尔值,设置(1,表示真)和未设置(0,表示假)。例如:

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;

顺便说一下,您也可以一次设置多个位。您可以使用以下方式将遮罩组合成一个遮罩&

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 回答