gpt4 book ai didi

Java位比较,bitset?

转载 作者:行者123 更新时间:2023-12-02 00:01:12 34 4
gpt4 key购买 nike

我的脑海中一直浮现着“bitset”这个词作为我的问题的解决方案,但我想我可能会让自己感到困惑。

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

0x0001 = Outside
0x20000000 = Blah...

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

位集实际上是我想要的吗,或者有更简单的方法吗?

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

非常感谢

最佳答案

您在寻找位掩码吗?这是 int 中每个位的位置。表示一个 boolean 值,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 ,并添加 L到每个1值被改变,并且您最多可以有 64 个条件,如下所示:

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;

顺便说一句,您也可以一次设置多个位。您可以使用 & 将 mask 组合成一个 mask 。 :

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
}

关于Java位比较,bitset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14817892/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com