将64位值拆分为四个16位

时间:2017-03-30 09:38:12

标签: java 64-bit bit-manipulation 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));

1 个答案:

答案 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向左移位。