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

Integer.parseInt(x, 2) is not considering sign bit

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() 方法(例如:Integer.parseInt() 需要 short,或 Long 需要 int) .如果有人试图解析负 long(因为没有比 long 更大的类型),这将不起作用。

但是@Tagir 的回答似乎适用于所有类型。所以让这个问题悬而未决。

根据Integer APIInteger.toBinaryString() returns 二进制补码,不是签名版本。这就是抛出 NumberFormatException 的原因。 您可以改用 Integer.parseUnsignedInt()

“11111111111111111111111111111111”太长了

System.out.println(Integer.toBinaryString(-1)); 
// This output's "11111111111111111111111111111111"
System.out.println(Long.parseLong(Integer.toBinaryString(-1), 2));

因为 Java 8 你可以使用 Integer.parseUnsignedInt(s, 2);:

System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-1), 2));

尝试使用

int i = Long.valueOf(str, 2).intValue();

使用:

int i = Long.valueOf("11111111111111111111111111111111", 2).intValue();
System.out.print(i);

输出:

-1