循环并 return Long 中的所有按位值
Loop and return all bitwise values in Long
要设置位,您可以使用 OR 运算符。然后,您可以使用 AND 运算符查看已设置了哪些位:
long values = 0;
// Set bits
values |= (1L << 10);
values |= (1L << 45);
values |= (1L << 5600);
// Check if values are set
System.out.println(hasValue(values, 45)); // Returns true
System.out.println(hasValue(values, 55)); // Returns false
System.out.println(hasValue(values, 5600)); // Returns true
public static boolean hasValue(long data, int value)
{
return (((data >> value) & 1L) > 0);
}
是否可以遍历 values
和 return 最初使用 OR 运算符设置的每个值?结果打印:
Found value: 10
Found value: 45
Found value: 5600
编辑:更改示例以包含更大的数字。
Java long
有 64 位。
因此您可以使用 8 位并存储最多 8 个整数,其值介于 0 和 255 之间(无符号)。
您将需要使用 shift 然后存储。
所以第一个无符号字节是 0-7 位,第二个是 8-15,第三个是 16-23 等等。
但并非如此。
希望我理解正确。您只需要将值移动 1,然后像这样检查最年轻的位 AND 1:
class Main {
public static void main(String args[]) {
long v = 0;
v |= (1L << 10);
v |= (1L << 45);
v |= (1L << 56);
int i = 0;
while(v != 0) {
if((v & 1L) == 1) {
System.out.println("Found value: " + i);
}
v = v >>> 1;
i++;
}
}
}
您可以在从 0 到 64 的循环中使用您的函数来查找所有内容,如下所示:
for (int i = 0; i < 64; i++) {
if (hasValue(values, i))
System.out.println(“Found value: “ + i);
}
但我认为有更好的方法。它对变量有破坏性,所以如果你想保存它以备后用,在循环之前做,但这里是:
for (int i = 0; i < 64 && values != 0; i++) {
if (values % 2 == 1)
System.out.println(“Found value: “ + i);
values = values >> 1;
}
最大的优点是一次移动一位,而不是每次需要移动 i 位。
要设置位,您可以使用 OR 运算符。然后,您可以使用 AND 运算符查看已设置了哪些位:
long values = 0;
// Set bits
values |= (1L << 10);
values |= (1L << 45);
values |= (1L << 5600);
// Check if values are set
System.out.println(hasValue(values, 45)); // Returns true
System.out.println(hasValue(values, 55)); // Returns false
System.out.println(hasValue(values, 5600)); // Returns true
public static boolean hasValue(long data, int value)
{
return (((data >> value) & 1L) > 0);
}
是否可以遍历 values
和 return 最初使用 OR 运算符设置的每个值?结果打印:
Found value: 10
Found value: 45
Found value: 5600
编辑:更改示例以包含更大的数字。
Java long
有 64 位。
因此您可以使用 8 位并存储最多 8 个整数,其值介于 0 和 255 之间(无符号)。
您将需要使用 shift 然后存储。
所以第一个无符号字节是 0-7 位,第二个是 8-15,第三个是 16-23 等等。
但并非如此。
希望我理解正确。您只需要将值移动 1,然后像这样检查最年轻的位 AND 1:
class Main {
public static void main(String args[]) {
long v = 0;
v |= (1L << 10);
v |= (1L << 45);
v |= (1L << 56);
int i = 0;
while(v != 0) {
if((v & 1L) == 1) {
System.out.println("Found value: " + i);
}
v = v >>> 1;
i++;
}
}
}
您可以在从 0 到 64 的循环中使用您的函数来查找所有内容,如下所示:
for (int i = 0; i < 64; i++) {
if (hasValue(values, i))
System.out.println(“Found value: “ + i);
}
但我认为有更好的方法。它对变量有破坏性,所以如果你想保存它以备后用,在循环之前做,但这里是:
for (int i = 0; i < 64 && values != 0; i++) {
if (values % 2 == 1)
System.out.println(“Found value: “ + i);
values = values >> 1;
}
最大的优点是一次移动一位,而不是每次需要移动 i 位。