Java位比较,位集?

Java位比较,位集?,java,hex,logic,bits,bitset,Java,Hex,Logic,Bits,Bitset,我脑子里一直想着“比特集”这个词来解决我的问题,但我想我可能把自己弄糊涂了 我有一个十六进制值列表,表示某些条件,例如: 0x0001 = Outside 0x20000000 = Blah... 现在我在读取一个int,我基本上想将int与所有现有的十六进制条件进行比较,看看它匹配什么。它可以匹配零、一或多个 位集是我想要的,还是有更简单的方法 问这个问题我觉得有点傻,但我记不起那个湿透的东西叫什么了!:) 非常感谢现在还不清楚您想要什么,但Java SDK确实提供了一个解决方案,以及许多使

我脑子里一直想着“比特集”这个词来解决我的问题,但我想我可能把自己弄糊涂了

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

0x0001 = Outside
0x20000000 = Blah...
现在我在读取一个int,我基本上想将int与所有现有的十六进制条件进行比较,看看它匹配什么。它可以匹配零、一或多个

位集是我想要的,还是有更简单的方法

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


非常感谢

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

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

我想您要找的单词是“位掩码”

我想您要找的单词是“位掩码”

您要找位掩码吗?在这里,
int
中的每一位表示一个布尔值,set(1,表示真)和unset(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;
    }
}
顺便说一下,您也可以一次设置多个位。您可以使用
将遮罩组合成一个遮罩:

public void setOutsideAndRaining(boolean outsideAndRaining) {
    int comboMask = OUTSIDE_MASK & WET_MASK;
    value = outsideAndRaining ? setBit(comboMask, value) : unsetBit(comboMask, value);
}
编辑:在看到下面kaliatech的答案后,您也可以使用。解决方案非常类似,但数学逻辑封装在
位集
对象中,它允许任意数量的位,因此不限于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
}

你在找我吗?在这里,
int
中的每一位表示一个布尔值,set(1,表示真)和unset(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;
    }
}
顺便说一下,您也可以一次设置多个位。您可以使用
将遮罩组合成一个遮罩:

public void setOutsideAndRaining(boolean outsideAndRaining) {
    int comboMask = OUTSIDE_MASK & WET_MASK;
    value = outsideAndRaining ? setBit(comboMask, value) : unsetBit(comboMask, value);
}
编辑:在看到下面kaliatech的答案后,您也可以使用。解决方案非常类似,但数学逻辑封装在
位集
对象中,它允许任意数量的位,因此不限于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
}

看起来您正在查找
枚举
开关
?特定位是否有意义?如果不是,我会使用普通的
enum
。我遇到的问题是int的32位中大约有40个左右的条件,我并不希望每个条件都有40个If语句。我以前见过一些使用C代码的东西,但我一辈子都记不清它是什么。所以1位实际上可以表示多个条件?(32位,40个条件?)?如果不是,我会使用普通的
enum
。我遇到的问题是int的32位中大约有40个左右的条件,我并不希望每个条件都有40个If语句。我以前见过一些使用C代码的东西,但我一辈子都记不清它是什么。所以1位实际上可以表示多个条件?(32位,40个条件?)update@Tony没问题,很高兴我能帮忙。@Tony没问题,很高兴我能帮忙。有趣的是,我不知道Java有这个类+1有趣的是,我不知道Java有这个类+1.