将 *binary* 字符串转换为数字时出现 NumberFormatException

NumberFormatException while converting a *binary* string to a number

所以我有这个二进制字符串(32 个字符对应 32 位):

 String s = "11111111110000011101110111011000";

当我尝试将其转换为数字时,它抛出 NumberFormatException:

 Integer.parseInt(s,2);

不明白为什么。任何的想法?奇怪的是,如果我用零位 (0) 替换字符串中左边 (1) 的第一位,那么它就可以工作了。第一位只是表示数字的符号,所以我应该不会在这里溢出4个字节吧?

=================

更新问题:感谢大家的回答。我现在明白了;基本上 parseInt() 方法无法处理符号位,它假定符号位仅代表任何其他位的值。所以现在的问题是如何将这样的二进制字符串转换为带符号的整数?我知道你们中的一些人建议我使用 long,但在我的情况下,我只需要它是一个 int(long 来解释,但你可以假设)。

您尝试解析的数字大于 2^31-1 (max integer),请改用 Long:

String s = "11111111110000011101110111011000";
System.out.println(Long.parseLong(s, 2)); // 4,290,895,320

如果你想知道整数的最大值是多少,你可以这样做:

System.out.println(Integer.MAX_VALUE); // 2,147,483,647

响应您的 UPDATE 部分,如果您不介意丢失信息(当您将 long 转换为 int 时会发生这种情况),您可以这样做:

String s = "11111111110000011101110111011000";
long l = Long.parseLong(s,2);
int i = (int)l;
System.out.println(i); // -4071976

您正在尝试将一个 32 位数字解析为一个 Integer,它只能有 31 位和一个符号。 parseInt 无法处理符号位;您需要将符号指定为 +-(或什么都不填)。你的号码应该是(如果我没有搞砸我的转换)-4071976,如果你把它给 parseInt 作为 -1111100010001000101000 可以 被解析],但 不是 作为 11111111110000011101110111011000

你说你正在尝试解析二进制字符串

String s = "11111111110000011101110111011000";

但是这个值超出了 Java 整数范围:

整数是32位的,对于Java,范围是-2,147,483,648到2,147,483,647。但是您输入的值超出了范围。所以你得到了例外。

但是long是64位的,范围是–9,223,372,036,854,775,808到 9 ,223,372,036,854,775,807。所以你可以使用下面的:

String s = "11111111110000011101110111011000";
Long.parseLong(s,2);//4290895320

正如其他人已经提到的,这个二进制字符串不适合 32 位 singed int。然而,由于 Java 8 你可以将它解析为 unsigned int,这非常有效!

String s = "11111111110000011101110111011000";
System.out.println(Integer.parseUnsignedInt(s, 2)); // -4071976

Java8 中还添加了其他有用的无符号数学方法。