[英]Wrapping 4 integers in a 64 bit long - java bitwise
好了,所以我有4个整数要打包。 这4个整数全部包含3个值,位于前2个字节中:
+--------+--------+
|xxpppppp|hdcsrrrr|
+--------+--------+
{pppppp}代表一个值,{hdcs}代表第二个值,{rrrr}代表最后一个值。
我想长时间打包这些整数中的4个。 我尝试了以下方法:
ordinal = (c1.ordinal() << (14*3) | c2.ordinal() << (14*2) | c3.ordinal() << 14 | c4.ordinal());
其中c1.ordinal()... c4.ordinal()是要包装的整数。
如果我运行测试,这似乎不起作用。 假设我要查找long c4.ordinal()
最后一个整数的值,其中{pppppp} = 41,{hdcs} = 8,{rrrr} = 14,我得到以下结果:
System.out.println(c4.ordinal() & 0xf); //Prints 14
System.out.println(hand.ordinal() & 0xf); // Prints 14 - correct
System.out.println(c4.ordinal() >> 4 & 0xf); // Prints 8
System.out.println(hand.ordinal() >> 4 & 0xf); // Prints 8 - correct
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 61 - NOT correct!
现在,以下对我来说很奇怪。 如果我删除前两个整数,而只包装后两个,则如下所示:
ordinal = (c3.ordinal() << 14 | c4.ordinal());
并运行相同的测试,我得到正确的结果:
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 41 - correct!
我不知道怎么了 对于我来说,如果删除前两个整数,我会得到正确的答案,这对我没有任何意义。 我开始认为这可能与长数据类型有关,但是我还没有发现任何支持这种理论的东西。
即使将结果分配给long
,所有操作都使用int
值执行,因此高阶位会丢失。 力“促销”的long
通过明确扩大值一long
。
long ordinal = (long) c1.ordinal() << (14*3) |
(long) c2.ordinal() << (14*2) |
(long) c3.ordinal() << 14 |
(long) c4.ordinal();
另外,除非您肯定每个值的高两位为零,否则可能会遇到其他问题。 为了安全起见,您可能希望屏蔽这些:
long ordinal = (c1.ordinal() & 0x3FFFL) << (14*3) |
(c2.ordinal() & 0x3FFFL) << (14*2) |
(c3.ordinal() & 0x3FFFL) << 14 |
(c4.ordinal() & 0x3FFFL);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.