首先,我知道Java不知道任何(无)符号性。我的问题涉及以下情况:假设您有一个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的回答。
long unsigned = Integer.toUnsignedLong(myIntger);
您可以使用API来完成工作:
long l = Long.parseLong(Integer.toBinaryString(i), 2);
toBinaryString()
方法的 javadoc 说明:
将整数参数作为无符号整数以二进制形式返回字符串表示。
虽然这种技术不如使用位掩码快,但也不算“慢”。
我在我的(典型)PC上进行了一些适当的计时,这个转换只花费了270纳秒,在我看来仍然相当快。
此外,它使用API来完成工作,而不是位运算,这样更易于阅读并且有一定的自我说明性。
& 0xFFFFFFFFL
,这样会稍微更短一些。 - Peter Lawrey