2016-11-22 52 views
2

我正在使用處理2.2.1。當我嘗試在32位整數上使用unbinary()時,除了第一個以外,每個位都可以翻轉。處理非二進制函數的問題

例如,

int output = unbinary("10000000000000000000000000000000"); 

這會拋出:

"NumberFormatException: For input string: "10000000000000000000000000000000" 

是否unbinary()不能處理32位整數?

回答

2

Processing's source,該unbinary()功能引擎蓋下稱Integer.parseInt()。根據the Java APIInteger.parseInt()函數需要一個有符號的值。這是一個問題,因爲32位int沒有符號,他們有符號位

換句話說,該unbinary()功能不被治療你輸入32位的值相同的方式的Java(和因此處理)將治療32位int。

int可容納的最大數字爲2,147,483,647。您輸入的二進制值轉換爲2,147,483,648,這超過了限制。

但值是一個32位數的二進制數!這不是一個32位整數?

unbinary()函數將二進制值視爲「人類可讀的」,這意味着它期望負號的符號。所以它接受像-101這樣的東西來表示-5二進制。但在引擎蓋下,這不是如何處理二元負值。 Java使用two's complement來表示負數,這意味着-5由二進制表示爲11111111111111111111111111111011

它變得有點複雜,但基本上是:如果一個二進制數與1開始,這意味着它是一個負數。

所以,10000000000000000000000000000000您輸入的數值計算僅在機器可讀的格式可能的最低值int-2,147,483,648unbinary()函數將它視爲「可讀性」格式,這就是爲什麼你會得到這種差異。

我該如何解決這個問題?

這真的取決於你爲什麼需要從二進制到整數。但你可以使用Integer.parseUnsignedInt()函數,它採用「機器可讀」格式的二進制值:

int output = Integer.parseUnsignedInt("10000000000000000000000000000000", 2); 
+0

方式比我更快,也很詳細:好的! (+1) –

+0

謝謝@George!起初,這個讓我撓了撓頭。我始終難以在腦中保留二進制文件! –