我已经把“bitset”这个词放在脑海中作为我问题的解决方案,但我想我可能会让自己感到困惑。
我有一个表示某些条件的十六进制值列表,例如:
0x0001 = Outside
0x20000000 = Blah...
现在我正在读取一个int,我基本上想要将int与所有现有的十六进制条件进行比较,以查看它匹配的内容。它可以匹配零个,一个或多个。
实际上我想要的是bitset,还是有更简单的方法呢?
我觉得这个问题有点傻,但我不记得这个叫做什么的东西! :)
非常感谢
答案 0 :(得分:1)
目前还不是很清楚你想要什么,但Java SDK确实提供了BitSet,以及一些使用BitSets的有用方法。在您的情况下,and()和intersects()方法可能是有用的。
答案 1 :(得分:1)
我认为你所追求的词是“bitmask”
答案 2 :(得分:1)
你在寻找位掩码吗?这是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
,并为要转移的每个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;
顺便说一下,您也可以一次设置多个位。您可以使用&
:
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
}