如何操作 long 中的位?
How to manipulate the bits in a long?
我想把一个长整数转成二进制码,然后改变一些位,再得到一个长整数。我找到了这个 post Java long to binary 但我仍然无法实现我想要的。
我认为有两种方法可以实现我的目标:
- 从 long 到 bitset 再到 long
- 从 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 位,左移,然后将结果与 |
(或)相结合。
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
我想把一个长整数转成二进制码,然后改变一些位,再得到一个长整数。我找到了这个 post Java long to binary 但我仍然无法实现我想要的。
我认为有两种方法可以实现我的目标:
- 从 long 到 bitset 再到 long
- 从 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 位,左移,然后将结果与 |
(或)相结合。
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