使用位在Integer中存储true / false

时间:2015-07-02 18:02:25

标签: java integer boolean long-integer bit

场合

我想要实现的是将true / false存储为Integer / Long中的一个位。问题是如果某个位是1或0,我就无法解决。

代码

public class Test
{
    private static long unlocked = 0;

    public static void main(String[] args)
    {
        setUnlocked(1);
        setUnlocked(2);
        setUnlocked(3);
        System.out.println(isUnlocked(2);
    }

    public static void setUnlocked(int id)
    {
        unlocked += Math.pow(2, id);
    }

    public static boolean isUnlocked(int id)
    {
        // ???
        return false;
    }

}

与上面的测试用例一样,它将产生以下位序列:1110 = 14。

修改

第二个问题:

    public static void setUnlocked(int id)
    {
        unlocked |= 1 << id;
    }

    public static void setUnlocked(int id, boolean set)
    {

    }

这将提供在给定位置将该位设置为0或1的选项。

但我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:6)

使用按位运算符:

public static void setUnlocked(int id)
{
    unlocked |= 1L<<id; // set the id'th bit
}

public static boolean isUnlocked(int id)
{
    return (unlocked & (1L<<id)) != 0; // get the id'th bit
}

1<<id是计算2 ^ id的最快方法。

按位OR(|)允许你在int中设置一个位。

按位AND(&amp;)可以获得一个位的值(通过清除所有其他位并检查结果是否为0)。

编辑:

public static void setUnlocked(int id, boolean set)
{
    if (set) {
        unlocked |= 1L<<id; // set the id'th bit
    } else {
        unlocked &= 0xffffffffffffffffL ^ (1L<<id); // clear the id'th bit
    }
}

答案 1 :(得分:0)

更灵活的方法是使用简单的Set<Integer>

static Set<Integer> unlocked = new HashSet<>();

public static void setUnlocked(int id) {
    unlocked.add(id);
}

public static boolean isUnlocked(int id) {
    return unlocked.contains(id);
}

此方法不依赖于id在任何特定范围内。为了线程安全,如果需要,请在Set上进行同步。