ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 8:为什么我不能将这个二进制字符串解析成一个长整数?

2019-10-09 11:11:14  阅读:258  来源: 互联网

标签:java java-8 long-integer string


长话短说,我在弄乱Java中的一些基本遗传算法.我用了很长时间来存储基因,但调试时却使用二进制字符串以提高可读性.我遇到了一种奇怪的情况,我无法解析一些以1开头的二进制字符串(我不知道是否总是这样,但这似乎与64个字符的字符串一致).

我可以通过以下示例复制它:

String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseLong(binaryString, 2);

它将抛出并产生以下堆栈跟踪:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1000000000000000000000000000000000000000000000000000000000000000"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Long.parseLong(Long.java:592)
    at com.company.Main.main(Main.java:25)

鉴于我有正确格式的长度为64个字符的二进制字符串,为什么不能将某些字符串解析为很长的长度?在大多数情况下,我的字符串是随机生成的,但是在上面的实例中这应该起作用(请参见Long.MIN_VALUE在Java中绝对是有效的long).

解决方法:

引用Long.toBinaryString(i) Javadoc(重点是我的):

Returns a string representation of the long argument as an unsigned integer in base 2.

并引用Long.parseLong(s, radix)(重点是我的):

Parses the string argument as a signed long in the radix specified by the second argument.

问题来自于这样的事实,即toBinaryString返回一个无符号值,而parseLong需要一个有符号值.

您应该改用Long.parseUnsignedLong(s, radix)

String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);

请注意,实际上在toBinaryString Javadoc中明确指出了这一点:

The value of the argument can be recovered from the returned string s by calling Long.parseUnsignedLong(s, 2).

标签:java,java-8,long-integer,string
来源: https://codeday.me/bug/20191009/1878976.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有