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 API,Integer.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
做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 API,Integer.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