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

守給你的承諾、 提交于 2019-12-01 11:21:35

问题


Long story short, I was messing around with some basic genetic algorithm stuff in Java. I was using a long to store my genes, but I was using binary strings for readability while debugging. I came across an odd situation where I couldn't parse some binary strings that start with a 1 (I don't know if this is always the case, but it seems to be consistent with strings of 64 characters in length).

I was able to replicate this with the following example:

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

Which will throw and produce the following 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)

Given that I have a correctly formatted binary string of sixty four characters in length, why can't I parse some strings to a long? Most of the time, my strings are randomly generated, but in the instance above this should work (seeing as Long.MIN_VALUE is definitely a valid long in Java).


回答1:


Quoting Long.toBinaryString(i) Javadoc (emphasis mine):

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

And quoting Long.parseLong(s, radix) (emphasis mine):

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

The problem comes from the fact that toBinaryString returns a unsigned value whereas parseLong expects a signed value.

You should use Long.parseUnsignedLong(s, radix) instead:

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

Note that this is actually explicitely said in toBinaryString Javadoc:

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



来源:https://stackoverflow.com/questions/33549941/java-8-why-cant-i-parse-this-binary-string-into-a-long

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!