所以我有这个二进制字符串(32个字符对应32位):
String s = "11111111110000011101110111011000";
当我尝试将其转换为数字时,它会抛出NumberFormatException:
Integer.parseInt(s,2);
无法弄清楚原因。任何的想法?奇怪的是,如果我用左位(1)将字符串中的第一位替换为零位(0),那么它就可以工作。第一位仅用于指示数字的符号,所以我不应该在这里溢出4个字节,对吗?
=================
更新的问题:感谢大家的答案。我现在明白了基本上parseInt()方法不能处理符号位,它假定符号位只表示任何其他位的值。所以现在的问题是如何将这样的二进制字符串转换为带符号的INTEGER数字?我知道有些人建议我使用long,但在我的情况下我只需要它是一个int(很长时间来解释,但你可以假设)。
答案 0 :(得分:3)
您尝试解析的数字大于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
答案 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