【问题标题】:Convert long to two int and vice versa将 long 转换为两个 int,反之亦然
【发布时间】:2012-05-21 13:27:29
【问题描述】:

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

【问题讨论】:

  • 你想以什么方式转换它们?一种可能性:(a
  • 签名还是未签名?如果无符号,那么负值意味着什么?

标签: java int long-integer


【解决方案1】:
long c = (long)a << 32 | b & 0xFFFFFFFFL;
int aBack = (int)(c >> 32);
int bBack = (int)c;

在 Java 中,您不需要那么多括号,也不需要对反向计算进行任何屏蔽。

【讨论】:

  • 承租人:for (long i = Long.MIN_VALUE; i &lt;= Long.MAX_VALUE; i++) {...
  • 292 年远远少于它需要的时间。我的电脑也声称 292 年,其他人也一样。对我来说 (stop - start)*2.0/reps*Long.MAX_VALUE) 是 1.207154932183553E22 而 Long.MaxValue 是 9223372036854775807 所以当转换为 (long) 发生时,每个人都以 9223372036854775807 结束。因为那是 1/1308 年的真实值,时间实际上应该是 382, (尽管实际答案是正确的,但仍然 +1)
  • 哈哈,非常好的理查德。我习惯于从不手动进行毫秒到其他东西的转换,但我也很少尝试在数百(或数十万)年中获得毫秒分辨率。由于我不再是老师,所以我将编辑掉整个“练习”部分。答案不需要那么长。
  • 对不起,如果大家都清楚这一点。有人可以解释一下吗。我理解我们正在腾出最后 32 位的第一部分。第二部分在做什么。与全为 1 的情况是什么?我用 ((long)a
  • (long)a
【解决方案2】:

整数到长整数:

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

我将把它作为练习留给读者执行反向计算。但提示是;使用更多位移和bit-masks

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

【讨论】:

  • 考虑到具体情况,我认为 b 很可能已经被假定为有效。
  • 这个答案有一点点错误:b = 0x1FFFFFFF 会失败,因为掩码中包含(截至本评论)七个 F,而不是八个。这意味着它不仅对于 b 的所有负值都失败(因为没有掩码的答案会失败),而且对于 b 的大正值也是如此。
猜你喜欢
  • 2011-09-03
  • 2020-07-08
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2020-10-24
  • 2021-06-10
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多