繁体   English   中英

在64位长中包装4个整数-Java按位

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM