如何操作 long 中的位?

How to manipulate the bits in a long?

我想把一个长整数转成二进制码,然后改变一些位,再得到一个长整数。我找到了这个 post Java long to binary 但我仍然无法实现我想要的。

我认为有两种方法可以实现我的目标:

  1. 从 long 到 bitset 再到 long
  2. 从 long 到二进制字符串,然后到 int 数组,然后再到 long
 public static long changeHalf(long x){
        int[] firstHalf = new int[32];
        int[] secondHalf = new int[32];
        int[] result = new int[64];


        String binaryOfLong = Long.toBinaryString(x);
        for (int i = 0; i < firstHalf.length; i++) {

        }

        for (int i = 0; i < secondHalf.length; i++) {
            result[i] = secondHalf[i];
        }
        for (int i = 0; i < firstHalf.length; i++) {
            result[i+32] = firstHalf[i];
        }

        String s = Arrays.toString(result);
        return Long.parseLong(s);
    }

与其将 long 转换为 int 的数组,不如使用按位运算。

I want to swap the first 32 bits with the last 32 bits

那就是:

long result = ((x & 0xFFFFFFFF00000000l) >> 32) | ((x & 0x00000000FFFFFFFFl) << 32);

屏蔽掉前 32 位,右移,屏蔽掉后 32 位,左移,然后将结果与 |(或)相结合。

Live example:

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        long x = 0x1000000020000000l;
        long result = ((x & 0xFFFFFFFF00000000l) >> 32) | ((x & 0x00000000FFFFFFFFl) << 32);
        System.out.printf("0x%016X\n", x);
        System.out.printf("0x%016X\n", result);
    }
}

输出:

0x1000000020000000
0x2000000010000000

更多内容在 Bitwise and Bit Shift Operators tutorial