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).
Quoting
Long.toBinaryString(i)
Javadoc (emphasis mine):And quoting
Long.parseLong(s, radix)
(emphasis mine):The problem comes from the fact that
toBinaryString
returns a unsigned value whereasparseLong
expects a signed value.You should use
Long.parseUnsignedLong(s, radix)
instead:Note that this is actually explicitely said in
toBinaryString
Javadoc: