Java 8:为什么我不能把这个二进制字符串解析成long?
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(强调我的):
Returns a string representation of the long argument as an unsigned integer in base 2.
并引用 Long.parseLong(s, radix)
(强调我的):
Parses the string argument as a signed long in the radix specified by the second argument.
问题是因为 toBinaryString
returns 是一个无符号值,而 parseLong
需要一个有符号值。
您应该改用 Long.parseUnsignedLong(s, radix)
:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);
请注意,这实际上在 toBinaryString
Javadoc 中有明确说明:
The value of the argument can be recovered from the returned string s
by calling Long.parseUnsignedLong(s, 2)
.
长话短说,我在 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(强调我的):
Returns a string representation of the long argument as an unsigned integer in base 2.
并引用 Long.parseLong(s, radix)
(强调我的):
Parses the string argument as a signed long in the radix specified by the second argument.
问题是因为 toBinaryString
returns 是一个无符号值,而 parseLong
需要一个有符号值。
您应该改用 Long.parseUnsignedLong(s, radix)
:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);
请注意,这实际上在 toBinaryString
Javadoc 中有明确说明:
The value of the argument can be recovered from the returned string
s
by callingLong.parseUnsignedLong(s, 2)
.