当前位置: 首页 > 知识库问答 >
问题:

将64位值拆分为四个16位

司马钱明
2023-03-14

我有如下64位值:

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1101 0011

给定数字流的十进制值为-45。

我想分成四个16位值:

1111111111111111111
1111111111111111111
1111111111111111111111111
11111111111111111010011

输入值是有符号长的。

如何在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个答案

夏侯楷
2023-03-14

编辑

你几乎是正确的(我打字太多了,认为你也需要基础知识,我的错)。

你只需要改变:buf[1]=l

我可以用不同的方式写,但这可能是最容易理解的:

 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

 类似资料:
  • 问题内容: 我有一个表字段,其中包含用户的姓氏和名字。是否有可能分裂成那些2场,? 所有记录的格式均为“名字的姓氏”(不带引号,中间还有空格)。 问题答案: 不幸的是,MySQL没有分割字符串功能。但是,您可以为此创建一个用户定义的函数,例如以下文章中描述的函数: Federico Cargnelutti撰写的MySQL Split String Function 使用该功能: 您将可以按照以下方

  • 我在presto上有一个表,它有多个记录的记录。在该记录中,我使用了这个简单的SQL查询,

  • 问题内容: 我有桌子: 我想要这样的输出: 问题答案: 如果可以创建一个数字表,其中包含从1到要拆分的最大字段的数字,则可以使用以下解决方案: 请看这里的小提琴。 如果无法创建表,则解决方案可以是: 这里有个小提琴例子。

  • 我有表: 我想要这样的输出:

  • 问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!

  • 我有一个数据帧,并希望将数据帧分割成两个基于多个列。 df的所有行都应该没有空列,状态为“是”。Rest应该在df_null上 德国行不在结果数据框中,因为它已被过滤掉。