[英]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)
(強調我的):
將字符串參數解析為第二個參數指定的基數中的有符號長整數。
問題來自於這樣的事實,即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
恢復參數的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.