所以我有这个二进制字符串(32个字符对应于32位):
String s = "11111111110000011101110111011000";当我试图将它转换为一个数字时,它会抛出一个NumberFormatException:
Integer.parseInt(s,2);不知道为什么。有什么想法吗?奇怪的是,如果我用零位(0)替换左(1)的字符串中的第一个位,那么它就工作了。第一个位只是用来表示数字的符号,所以我不应该在这里溢出4个字节,对吗?
=================
更新了问题:感谢大家的回答。我现在得到了它;基本上,parseInt()方法不能处理符号位,它假设符号位只是将值表示为任何其他位。那么,现在的问题是,如何将这样的二进制字符串转换为有符号整数?我知道你们中的一些人建议我使用long,但在我的情况下,我只需要它是一个int (很长时间可以解释,但您可以假设)。
发布于 2015-06-03 04:01:29
您要解析的数字大于2^31-1 (最大整数),请使用Long:
String s = "11111111110000011101110111011000";
System.out.println(Long.parseLong(s, 2)); // 4,290,895,320如果您想查看Integer的最大值,您可以这样做:
System.out.println(Integer.MAX_VALUE); // 2,147,483,647响应您的更新部分,如果您不介意松散信息(当您将long转换为int时会发生这种情况),您可以这样做:
String s = "11111111110000011101110111011000";
long l = Long.parseLong(s,2);
int i = (int)l;
System.out.println(i); // -4071976发布于 2015-06-03 04:02:26
您正在尝试将一个32位数字解析为一个Integer,它只能有31位和一个符号。parseInt无法处理符号位;您需要将该符号指定为+或- (或无)。您的号码应该是(如果我没有搞砸我的转换的话) -4071976,如果您把它作为-1111100010001000101000,而不是11111111110000011101110111011000,就可以解析它。
发布于 2015-06-03 04:28:24
正如其他人已经提到的,这个二进制字符串不适合32位被签名的int。但是,因为Java 8,您可以将它解析为无符号int,它工作得很好!
String s = "11111111110000011101110111011000";
System.out.println(Integer.parseUnsignedInt(s, 2)); // -4071976Java 8中还添加了其他有用的无符号数学方法。
https://stackoverflow.com/questions/30610583
复制相似问题