Pau*_*ker 1 java string java-8 long-integer
长话短说,我在Java中搞乱了一些基本的遗传算法.我用a long来存储我的基因,但我在调试时使用二进制字符串来提高可读性.我遇到了一个奇怪的情况,我无法解析一些以a开头的二进制字符串1(我不知道是否总是这样,但它似乎与长度为64个字符的字符串一致).
我能够通过以下示例复制此内容:
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseLong(binaryString, 2);
Run Code Online (Sandbox Code Playgroud)
将抛出并生成以下堆栈跟踪:
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)
Run Code Online (Sandbox Code Playgroud)
鉴于我有一个正确格式化的六十四个字符的二进制字符串,为什么我不能解析一些字符串?大多数情况下,我的字符串是随机生成的,但在上面的实例中,这应该可以工作(Long.MIN_VALUE在Java中看来肯定是有效的长).
Tun*_*aki 15
引用Long.toBinaryString(i)Javadoc(强调我的):
返回long参数的字符串表示形式,作为base 2中的无符号整数.
引用Long.parseLong(s, radix)(强调我的):
将字符串参数解析为第二个参数指定的基数中的有符号 long.
问题来自于toBinaryString返回无符号值而parseLong预期有符号值的事实.
您应该使用Long.parseUnsignedLong(s, radix):
String binaryString = Long.toBinaryString(Long.MIN_VALUE);
long smallestLongPossibleInJava = Long.parseUnsignedLong(binaryString, 2);
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上是在toBinaryStringJavadoc中明确说明的:
可以
s通过调用从返回的字符串中恢复参数的值Long.parseUnsignedLong(s, 2).
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |