我有如下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));
编辑
你几乎是正确的(我打字太多了,认为你也需要基础知识,我的错)。
你只需要改变: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上 德国行不在结果数据框中,因为它已被过滤掉。