Java 8:为什么可以'我不能把这个二进制字符串解析成长字符串吗?[英] 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(强调我的):

<块引用>

将 long 参数的字符串表示形式返回为以 2 为底的 无符号 整数.

并引用 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 中明确表示:

<块引用>

参数的值可以通过调用Long.parseUnsignedLong(s, 2)从返回的字符串s中恢复.

本文地址:https://www.itbaoku.cn/post/978419.html