我有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));
答案 0 :(得分:0)
修改强>
你几乎是正确的(我做了太多的打字,认为你也需要基础知识,我的坏)。
您需要更改的是: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
- &gt; 0011
,您已将7
向左移位。