使用位在Integer中存储true/false

use*_*086 1 java integer boolean bit long-integer

情况

我想要实现的是将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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

编辑

第二个问题:

    public static void setUnlocked(int id)
    {
        unlocked |= 1 << id;
    }
Run Code Online (Sandbox Code Playgroud)

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

    }
Run Code Online (Sandbox Code Playgroud)

这将给出在给定位置将该位设置为0或1的选项.

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

Era*_*ran 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
}
Run Code Online (Sandbox Code Playgroud)

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

按位OR(|)允许您在int中设置一个位.

按位AND(&)允许您获取一个位的值(通过清除所有其他位并检查结果是否为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
    }
}
Run Code Online (Sandbox Code Playgroud)