我有一个数字的二进制表示,并希望将其转换为long(我有Java 8)
public class TestLongs {
public static void main(String[] args){
String a = Long.toBinaryString(Long.parseLong("-1")); // 1111111111111111111111111111111111111111111111111111111111111111
System.out.println(a);
System.out.println(Long.parseLong(a, 2));// ??? but Long.parseUnsignedLong(a, 2) works
}
}
此代码会生成Exception in thread "main" java.lang.NumberFormatException: For input string: "1111111111111111111111111111111111111111111111111111111111111111"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
1111111111111111111111111111111111111111111111111111111111111111
at java.lang.Long.parseLong(Long.java:592)
这有什么不对?为什么Long.parseLong(a,2)不起作用?
答案 0 :(得分:5)
Long.parseLong()
没有对待第一个' 1'字符作为符号位,因此该数字被解析为2 ^ 64-1,这对于long
来说太大了。 Long.parseLong()
期望输入String
代表负数,以' - '开始。
为了Long.parseLong(str,2)
要返回-1
,您应该传递String
,以' - '开头。并以1
的二进制表示结束 - 即Long.parseLong("-1",2)
。
答案 1 :(得分:3)
Eran是对的,你问题的答案是:
System.out.println(new BigInteger(a, 2).longValue());