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

标签 java string java-8 long-integer

长话短说,我在 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 返回一个无符号值,而 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 8 : Why can't I parse this binary string into a long?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549941/

相关文章:

java - 字符串初始化

php - 如何在 PHP 中删除字符串末尾的所有特定字符?

java - 关于 lambda 语法

java - 为什么此 java 8 流操作评估为 Object 而不是 List<Object> 或只是 List?

java - 如何使用Java中的SAX解析器检查xml标签是否具有属性?

java - Google App Engine 服务器将数据发送到云数据存储,即使它通过本地主机运行 :8080

r - 没有循环的数据框中的子字符串,填充和粘贴列

java - 变量已在方法 lambda 中定义

java - 如何捕获字符串表达式并仅替换其中的一部分?

java - Android 主线程 Looper 关注点