长话短说,我正在用 Java 搞一些基本的遗传算法。我当时用的是long
存储我的基因,但我在调试时使用二进制字符串以提高可读性。我遇到了一个奇怪的情况,我无法解析一些以 a 开头的二进制字符串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 字符串?大多数时候,我的字符串是随机生成的,但在上面的例子中这应该可以工作(参见Long.MIN_VALUE
在 Java 中绝对是有效的 long)。
Quoting Long.toBinaryString(i) https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#toBinaryString-long-Javadoc(强调我的):
返回长参数的字符串表示形式unsigned以 2 为底的整数。
并引用Long.parseLong(s, radix) https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#parseLong-java.lang.String-int-(强调我的):
将字符串参数解析为signedlong 以第二个参数指定的基数表示。
问题来自于这样一个事实:toBinaryString
返回一个无符号值,而parseLong
期望有符号的值。
你应该使用Long.parseUnsignedLong(s, radix) https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#parseUnsignedLong-java.lang.String-int-反而:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);
请注意,这实际上是在toBinaryString
Java文档:
可以从返回的字符串中恢复参数的值s
通过致电Long.parseUnsignedLong(s, 2)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)