Как манипулировать битами в длинных? - PullRequest
1 голос
/ 10 июня 2019

Я хочу преобразовать длинный в двоичный код, затем изменить некоторые биты и снова получить длинный.Я нашел этот пост Java от двоичного до , но я все еще не могу достичь того, чего хочу.

Я думаю, что есть два способа достичь моей цели:

  1. Переход от long к битам и снова к 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);
    }

1 Ответ

4 голосов
/ 10 июня 2019

Вместо преобразования long в массивы int, просто используйте побитовые операции.

Я хочу поменять первые 32 бита на последние 32 бита

Это будет:

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

Это маскирует первые 32 бита, сдвигает их вправо, маскирует последние 32 бита, сдвигает их влево и объединяет результат с | (ИЛИ).

Пример в реальном времени :

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

Больше в Побитовое и битовое смещениеУчебник для операторов .

...