首先:我知道Java不知道任何(un)signness的事实
我的问题涉及以下情况:
想象一下,你有一个int i = -1 // ( == 0b1111111_11111111_11111111_11111111)
. 现在我想将其“转换”为表示字节值的长整数,例如在这种具体情况下long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111)
:
我的问题是如何l
从i
上面的示例中获得。
首先:我知道Java不知道任何(un)signness的事实
我的问题涉及以下情况:
想象一下,你有一个int i = -1 // ( == 0b1111111_11111111_11111111_11111111)
. 现在我想将其“转换”为表示字节值的长整数,例如在这种具体情况下long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111)
:
我的问题是如何l
从i
上面的示例中获得。
您可以使用按位数学,应该从下面的代码中自我解释。不明白的可以在评论中提问。
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
Java 8 添加了一些对处理无符号类型的支持。在这种情况下,您可以使用Integer.toUnsignedLong
,相当于durron597 的 answer。
long unsigned = Integer.toUnsignedLong(myIntger);
您可以使用 API 来完成这项工作:
long l = Long.parseLong(Integer.toBinaryString(i), 2);
方法javadoctoBinaryString()
说
将整数参数的字符串表示形式返回为以 2 为底的无符号整数。
虽然,这种技术不如使用位掩码快,但它并不“慢”。
我在我的(典型)PC 上做了一些适当的计时,这个转换只用了270 纳秒,这在我的书中仍然非常快。
此外,它使用 API 来完成工作,而不是 bit kung fu,这更容易阅读并且有点自我记录。