Integer.parseInt(x,2)没有考虑符号位

时间:2015-08-18 04:06:09

标签: java parseint

执行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的答案似乎适用于所有类型。所以请保持这个问题。

4 个答案:

答案 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 APIInteger.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));