簡體   English   中英

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) (強調我的):

將字符串參數解析為第二個參數指定的基數中的有符號長整數。

問題來自於這樣的事實,即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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM