将长整型转换为两个整型,反之亦然

25

如何将两个32位整数(int)转换为一个64位的long,反之亦然?


你想以什么方式进行转换?一种可能的方式是:(a << Integer.SIZE) | b - Nathan Ryan
有符号还是无符号?如果是无符号的话,负数的意义是什么? - Aleks G
2个回答

51
long c = (long)a << 32 | b & 0xFFFFFFFFL;
int aBack = (int)(c >> 32);
int bBack = (int)c;

在Java中,你不需要那么多括号,也不需要对反向计算进行任何掩码处理。


1
承租人:for (long i = Long.MIN_VALUE; i <= Long.MAX_VALUE; i++) {... - Hot Licks
292年远远不及所需时间。我的计算机也需要292年,其他人的也是如此。对于我而言(stop - start)*2.0/reps*Long.MAX_VALUE)为1.207154932183553E22,而Long.MaxValue为9223372036854775807,因此当转换为(long)时,所有人最终都得到9223372036854775807。由于这只是真实值的1/1308,因此实际上需要382,000年的时间。(虽然答案是正确的,但仍需加1) - Richard Tingle
哈哈,非常好的Richard。我习惯于从不手动进行毫秒到其他单位的转换,但我也很少尝试在数百年(或数十万年)内获得毫秒分辨率。由于我不再是老师了,我将编辑掉整个“练习”部分。答案不需要那么长。 - Fuwjax
抱歉如果这对每个人来说都很清楚。有人能解释一下吗?我理解我们正在清空最后32位的第一部分。第二部分在做什么?将所有1与AND运算会得到什么?我尝试了((long)a << 32) + b,它给出了相同的输出,这就是为什么我想知道掩码的用途。 - Ashwin
(long)a << 32 + b 只有在 b 为正数时才有效。在 Java 中,int 是带符号的,因此您必须适当处理符号。我们没有使用全部为 1 的 AND 运算,掩码是一个长整型(64 位),其中低 32 位为 1,这在我们将其存储在 long 中时有效地将 b 视为无符号 int。 - Fuwjax

2

整数转换为长整型:

long c = ((long)a << 32) | ((long)b & 0xFFFFFFFFL);

我将把它留给读者作为一个练习来执行反向计算。但提示是:使用更多的位移和位掩码

(根据T. Murdock的评论进行编辑)


我认为在这种情况下,b可能已经被认为是有效的。 - Tharwen
4
这个回答有细微错误:对于 b = 0x1FFFFFFF,它将失败,因为掩码中包含(截至本评论时)七个 F,而不是八个。这意味着它不仅对于所有负值的 b 失败(就像没有掩码的答案一样会失败),而且对于大的正值的 b 也会失败。 - Theodore Murdock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接