首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumberFormatException,同时将*二进制*字符串转换为数字

NumberFormatException,同时将*二进制*字符串转换为数字
EN

Stack Overflow用户
提问于 2015-06-03 03:58:55
回答 4查看 3.1K关注 0票数 2

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

代码语言:javascript
复制
 String s = "11111111110000011101110111011000";

当我试图将它转换为一个数字时,它会抛出一个NumberFormatException:

代码语言:javascript
复制
 Integer.parseInt(s,2);

不知道为什么。有什么想法吗?奇怪的是,如果我用零位(0)替换左(1)的字符串中的第一个位,那么它就工作了。第一个位只是用来表示数字的符号,所以我不应该在这里溢出4个字节,对吗?

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-03 04:01:29

您要解析的数字大于2^31-1 (最大整数),请使用Long:

代码语言:javascript
复制
String s = "11111111110000011101110111011000";
System.out.println(Long.parseLong(s, 2)); // 4,290,895,320

如果您想查看Integer的最大值,您可以这样做:

代码语言:javascript
复制
System.out.println(Integer.MAX_VALUE); // 2,147,483,647

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

代码语言:javascript
复制
String s = "11111111110000011101110111011000";
long l = Long.parseLong(s,2);
int i = (int)l;
System.out.println(i); // -4071976
票数 3
EN

Stack Overflow用户

发布于 2015-06-03 04:02:26

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-03 04:28:24

正如其他人已经提到的,这个二进制字符串不适合32位被签名的int。但是,因为Java 8,您可以将它解析为无符号int,它工作得很好!

代码语言:javascript
复制
String s = "11111111110000011101110111011000";
System.out.println(Integer.parseUnsignedInt(s, 2)); // -4071976

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30610583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档