使用位将 true/false 存储为整数
Store true/false in Integer using the bits
情况
我想要实现的是将 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 的选项。
但是我该如何实现呢?
使用按位运算符:
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 最快的方法。
按位或 (|) 可让您在 int 中设置位。
按位与 (&) 可让您获得位的值(通过清除所有其他位并检查结果是否不为 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
}
}
更灵活的方法是使用简单的 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
上同步。
情况
我想要实现的是将 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 的选项。
但是我该如何实现呢?
使用按位运算符:
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 最快的方法。
按位或 (|) 可让您在 int 中设置位。
按位与 (&) 可让您获得位的值(通过清除所有其他位并检查结果是否不为 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
}
}
更灵活的方法是使用简单的 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
上同步。