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的选项.
但是我怎样才能做到这一点?
使用按位运算符:
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)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |