繁体   English   中英

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

[英]Java 8: Why can't I parse this binary string into a long?

长话短说,我在弄乱Java中的一些基本遗传算法。 我用了long来存储基因,但调试时却使用二进制字符串以提高可读性。 我遇到了一种奇怪的情况,我无法解析一些以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(重点是我):

返回long参数的字符串表示形式,以2为底的无符号整数。

并引用Long.parseLong(s, radix) (强调我的):

将字符串参数解析为第二个参数指定的基数中的有符号长整数。

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

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

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

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

可以通过调用Long.parseUnsignedLong(s, 2)从返回的字符串s恢复参数的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM