Java:将有符号整数转换为无符号长整型

3
首先,我知道Java不知道任何(无)符号性。我的问题涉及以下情况:假设您有一个int i = -1 //(== 0b1111111_11111111_11111111_11111111)。现在我想将其“转换”为表示字节值的长整型,例如在这种具体情况下:long l = 0xFFFFFFFF //(== 0b1111111_11111111_11111111_11111111)。我的问题是如何从上面的示例中获取l和i。
3个回答

4

你可以使用位运算,从下面的代码应该很容易理解。如果你不理解,请在评论区询问。

public class LongConversion {
  public static void main(String args[]) {
    for (int i = -1; i > -40; i -= 9) {
      // THIS IS THE IMPORTANT LINE, THE REST IS JUST FOR DEMONSTRATION
      long l = 0x00000000FFFFFFFFl & (long) i;

      System.out.println("Original i: " + i);
      System.out.println(Integer.toHexString(i));
      System.out.println("Longed i: " + l);
      System.out.println(zeroLong(l));
      System.out.println();
    }
  }

  public static String zeroLong(long l) {
    return String.format("%16s", Long.toHexString(l)).replace(' ', '0');
  }
}

这段代码输出:
Original i: -1
ffffffff
Longed i: 4294967295
00000000ffffffff

Original i: -10
fffffff6
Longed i: 4294967286
00000000fffffff6

Original i: -19
ffffffed
Longed i: 4294967277
00000000ffffffed

Original i: -28
ffffffe4
Longed i: 4294967268
00000000ffffffe4

Original i: -37
ffffffdb
Longed i: 4294967259
00000000ffffffdb

2
你可以使用 & 0xFFFFFFFFL,这样会稍微更短一些。 - Peter Lawrey
2
真的,但我追求的是清晰而不是简洁。 - durron597

2

-1

您可以使用API来完成工作:

long l = Long.parseLong(Integer.toBinaryString(i), 2);

toBinaryString() 方法的 javadoc 说明:

将整数参数作为无符号整数以二进制形式返回字符串表示。


虽然这种技术不如使用位掩码快,但也不算“慢”。

我在我的(典型)PC上进行了一些适当的计时,这个转换只花费了270纳秒,在我看来仍然相当快。

此外,它使用API来完成工作,而不是位运算,这样更易于阅读并且有一定的自我说明性。


字符串解析在这种情况下从来不是正确的答案。非常缓慢。 - durron597
@durron597 虽然它不像位掩码那样快,但也不慢。我在我的(典型的)PC上进行了一些计时,转换只花费了270纳秒,这在我的书中相当快。而且,它使用API来完成工作,我认为这是位操作的有效替代方案。 - Bohemian
比特功夫需要多长时间? - durron597
顺便说一句:这仍然是一个不错的补充(虽然我不建议使用^^)。-> +1 - brimborium
你的基准测试非常主观。考虑一下如果你尝试在嵌入式环境中运行会发生什么。 - Jaberino
显示剩余3条评论

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