gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:41:21 25 4
gpt4 key购买 nike

好吧,我有 4 个整数想要用 long 包装起来。这 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() 是要换行的整数。

如果我运行测试,这似乎不起作用。假设我想查找长整型 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);

关于java - 将 4 个整数包装在 64 位长中 - java 按位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2334719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com