3

首先:我知道Java不知道任何(un)signness的事实

我的问题涉及以下情况:

想象一下,你有一个int i = -1 // ( == 0b1111111_11111111_11111111_11111111). 现在我想将其“转换”为表示字节值的长整数,例如在这种具体情况下long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111)

我的问题是如何li上面的示例中获得。

4

3 回答 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
于 2012-11-29T16:32:18.617 回答
1

Java 8 添加了一些对处理无符号类型的支持。在这种情况下,您可以使用Integer.toUnsignedLong,相当于durron597 的 answer

long unsigned = Integer.toUnsignedLong(myIntger);
于 2015-09-02T15:52:57.223 回答
-1

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

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

方法javadoctoBinaryString()

将整数参数的字符串表示形式返回为以 2 为底的无符号整数。


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

我在我的(典型)PC 上做了一些适当的计时,这个转换只用了270 纳秒,这在我的书中仍然非常快。

此外,它使用 API 来完成工作,而不是 bit kung fu,这更容易阅读并且有点自我记录。

于 2012-11-29T16:32:15.730 回答