将 64 位值拆分为四个 16 位值
Split 64-bit value to four 16-bit
我有这样的 64 位值:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
1101 0011
给定数字流的十进制值为-45。
我想分成四个 16 位值:
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1101 0011
输入值是有符号长整数。
如何在 Java 中做到这一点?
到目前为止,我已经尝试过这种方式:
long[] buf = new long[4];
buf[0] = (l&0xFF);
buf[1] = (l&0xFF >> 16) & 0XFF;
buf[2] = (l&0xFF >> 32) & 0XFF;
buf[3] = (l&0xFF >> 48) & 0XFF;
但我认为我用位移逻辑弄乱了一些东西。
编辑
感谢@Eugene 的正确解决方案是:
long l = 45;
long[] buf = new long[4];
buf[0] = (l & 0xFFFF);
buf[1] = l >> 16 & 0XFFFF;
buf[2] = l >> 32 & 0XFFFF;
buf[3] = l >> 48 & 0XFFFF;
long result = ( buf[3] & 0xFFFF) << 48 | ( buf[2] & 0xFFFF) << 32 | (buf[1] & 0xFFFF) << 16 | (buf[0] & 0xFFFF);
System.out.println("Decimal: " + result);
System.out.println("Binary: "Long.toBinaryString(result));
编辑
你几乎是正确的(我打字太多了,以为你也需要基础知识,我的错)。
您只需更改:buf[1] = l >> 16 & 0xFFFF;
我本可以写成不同的,但这可能是最容易理解的:
long t = Long.parseUnsignedLong("1111111111111111111111111111111111111111111111111111111111010011", 2);
long twoPower16 = Long.parseLong("1111111111111111", 2);
long one = t & twoPower16;
long two = t >> 16 & twoPower16;
long thr = t >> 32 & twoPower16;
long fou = t >> 48 & twoPower16;
System.out.println(Long.toBinaryString(one));
System.out.println(Long.toBinaryString(two));
System.out.println(Long.toBinaryString(thr));
System.out.println(Long.toBinaryString(fou));
当你做一个&
操作时(它被称为掩码),例如:
0101
0011
----
0001 --> you are keeping the last two bits here
而 >>
是移位运算符。您告诉要移动多少位:
System.out.println(7 >> 1); // 3
这实际上是 0111 >> 1
--> 0011
,您向左移动了 7
位。
我有这样的 64 位值:
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1101 0011
给定数字流的十进制值为-45。
我想分成四个 16 位值:
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1101 0011
输入值是有符号长整数。
如何在 Java 中做到这一点?
到目前为止,我已经尝试过这种方式:
long[] buf = new long[4];
buf[0] = (l&0xFF);
buf[1] = (l&0xFF >> 16) & 0XFF;
buf[2] = (l&0xFF >> 32) & 0XFF;
buf[3] = (l&0xFF >> 48) & 0XFF;
但我认为我用位移逻辑弄乱了一些东西。
编辑
感谢@Eugene 的正确解决方案是:
long l = 45;
long[] buf = new long[4];
buf[0] = (l & 0xFFFF);
buf[1] = l >> 16 & 0XFFFF;
buf[2] = l >> 32 & 0XFFFF;
buf[3] = l >> 48 & 0XFFFF;
long result = ( buf[3] & 0xFFFF) << 48 | ( buf[2] & 0xFFFF) << 32 | (buf[1] & 0xFFFF) << 16 | (buf[0] & 0xFFFF);
System.out.println("Decimal: " + result);
System.out.println("Binary: "Long.toBinaryString(result));
编辑
你几乎是正确的(我打字太多了,以为你也需要基础知识,我的错)。
您只需更改:buf[1] = l >> 16 & 0xFFFF;
我本可以写成不同的,但这可能是最容易理解的:
long t = Long.parseUnsignedLong("1111111111111111111111111111111111111111111111111111111111010011", 2);
long twoPower16 = Long.parseLong("1111111111111111", 2);
long one = t & twoPower16;
long two = t >> 16 & twoPower16;
long thr = t >> 32 & twoPower16;
long fou = t >> 48 & twoPower16;
System.out.println(Long.toBinaryString(one));
System.out.println(Long.toBinaryString(two));
System.out.println(Long.toBinaryString(thr));
System.out.println(Long.toBinaryString(fou));
当你做一个&
操作时(它被称为掩码),例如:
0101
0011
----
0001 --> you are keeping the last two bits here
而 >>
是移位运算符。您告诉要移动多少位:
System.out.println(7 >> 1); // 3
这实际上是 0111 >> 1
--> 0011
,您向左移动了 7
位。