循环并 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 位。