【问题标题】:Integer.parseInt(x, 2) is not considering sign bit [duplicate]Integer.parseInt(x, 2) 不考虑符号位[重复]
【发布时间】:2015-08-18 12:43:10
【问题描述】:

在做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() 或需要 int 时的长整数)。如果有人试图解析负长(因为没有比长更大的类型),这将不起作用。

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

【问题讨论】:

  • “这不会在所有情况下都有效” ...你能举一个它不起作用的例子吗?
  • 您的问题是关于intInteger 类型,因此“所有情况”是否指更大的类型还不清楚。它确实确​​实适用于括号中的短语所涵盖的“所有情况”。

标签: java parseint


【解决方案1】:

从 Java 8 开始你可以使用Integer.parseUnsignedInt(s, 2);:

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

【讨论】:

  • 这很好用。谢谢。
【解决方案2】:

尝试使用

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

使用:

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

输出:

-1

【讨论】:

  • @ILikeTau 尝试自己运行。
  • 嗯……我没有看到 intValue(). 重新投票并删除我的评论。
【解决方案3】:

“1111111111111111111111111111111”太长了

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

【讨论】:

  • 这不起作用,因为它返回 twos 补码,使用 Long 无法解决此问题。
  • @ILikeTau 将生成的long 转换为int 应该可以工作。
  • 是的,但答案没有这么说。此外,在处理 Integer 的方法时使用它们似乎更优雅。
【解决方案4】:

根据Integer APIInteger.toBinaryString() 返回二进制补码,而不是签名版本。这就是为什么这会引发NumberFormatException。 你可以改用Integer.parseUnsignedInt()

【讨论】:

  • 是的。但是有没有一种方法可以毫无例外地正确解析它?
  • 使用Integer.parseUnsignedInt()
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2019-06-25
相关资源
最近更新 更多