长话短说,我在Java中搞乱了一些基本的遗传算法。我使用long
来存储我的基因,但我在调试时使用二进制字符串来提高可读性。我遇到了一个奇怪的情况,我无法解析一些以1
开头的二进制字符串(我不知道是否总是如此,但它似乎与长度为64个字符的字符串一致)。
我能够通过以下示例复制此内容:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseLong(binaryString, 2);
将抛出并生成以下stacktrace:
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中的有效长度。)
答案 0 :(得分:15)
引用Long.toBinaryString(i)
Javadoc(强调我的):
将long参数的字符串表示形式返回为base 2中的 unsigned 整数。
引用Long.parseLong(s, radix)
(强调我的):
将字符串参数解析为第二个参数指定的基数中的 signed long。
问题来自于toBinaryString
返回无符号值而parseLong
期望有符号值的事实。
您应该使用Long.parseUnsignedLong(s, radix)
代替:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);
请注意,toBinaryString
Javadoc中实际上已明确说明了这一点:
可以通过调用
s
从返回的字符串Long.parseUnsignedLong(s, 2)
恢复参数的值。