将*二进制*字符串转换为数字

时间:2015-06-03 03:58:55

标签: java binary integer number-formatting

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

 String s = "11111111110000011101110111011000";

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

 Integer.parseInt(s,2);

无法弄清楚原因。任何的想法?奇怪的是,如果我用左位(1)将字符串中的第一位替换为零位(0),那么它就可以工作。第一位仅用于指示数字的符号,所以我不应该在这里溢出4个字节,对吗?

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

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

4 个答案:

答案 0 :(得分:3)

您尝试解析的数字大于2^31-1max 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

答案 1 :(得分:3)

正如其他人已经提到的,这个二进制字符串不适合32位 singed int。但是,从Java 8开始,您可以将其解析为unsigned int,这非常有效!

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

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

答案 2 :(得分:2)

您正在尝试将32位数字解析为Integer,其中只能有31位和一个符号。 parseInt无法处理符号位;您需要将标记设为+-(或不提供)。您的号码应该是(如果我没有搞砸我的转化)-4071976,如果您将{em> 分配给parseInt -1111100010001000101000,那么可以解析11111111110000011101110111011000

答案 3 :(得分:0)

您告诉您正在尝试解析binay String

String s = "11111111110000011101110111011000";

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

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

但长期有64位,范围是-9,223,372,036,854,775,808到 9,223,372,036,854,775,807。所以你可以使用以下内容:

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