执行Integer.parseInt(x, 2)
时,它没有考虑符号位。
举个例子,
System.out.println(Integer.toBinaryString(-1)); // This output's "11111111111111111111111111111111"
System.out.println(Integer.parseInt(Integer.toBinaryString(-1), 2));
第二行抛出,
Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111111111111111111111111111"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at com.Test.main(Test.java:116)
我有一个方案可以将Integer
转换为Binary String
,然后将其转换回来。
有没有办法让parseInt()
方法用符号位解析 ?
this问题中的答案有一个hacky解决方案,可以在更大的数据类型上使用parseXX()
方法(例如:需要short时使用Integer.parseInt(),或者需要int时使用Long) 。如果有人试图解析一个负数(因为那里的类型不比长数字长),这就无法工作。
但@ Tagir的答案似乎适用于所有类型。所以请保持这个问题。
答案 0 :(得分:4)
从Java 8开始,您可以使用Integer.parseUnsignedInt(s, 2);
:
System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-1), 2));
答案 1 :(得分:3)
尝试使用
int i = Long.valueOf(str, 2).intValue();
使用:
int i = Long.valueOf("11111111111111111111111111111111", 2).intValue();
System.out.print(i);
输出:
-1
答案 2 :(得分:0)
根据Integer API,Integer.toBinaryString()
返回两个补码,而不是签名版本。这就是为什么这会引发NumberFormatException
。
您可以改为使用Integer.parseUnsignedInt()
。
答案 3 :(得分:0)
“11111111111111111111111111111111”太长了
System.out.println(Integer.toBinaryString(-1));
// This output's "11111111111111111111111111111111"
System.out.println(Long.parseLong(Integer.toBinaryString(-1), 2));