2014-11-25 56 views
1

我無法找到一種方法將32位二進制補碼二進制數轉換爲java中的小數。當它應該是負數時,我得到溢出錯誤或數字非負。使用java將32位二進制補碼轉換爲十進制數

String bin = "11111111111111111111111111111110"; 
long foo = Long.parseLong(bin); 
System.out.println(foo); 

這是我嘗試過的一件事情,我想我需要使用很長時間,因爲它可以容納多達64位。任何幫助都會很棒。謝謝

+1

一個32位二進制補碼數是' int'。 – 2014-11-25 03:59:49

回答

0

radix是使用的編號系統的基礎。

public static void main(String[] args) { 
     int bits = (int) Long.parseLong("11111111111111111111111111111110", 2); 
     System.out.println(bits); 
    } 

輸出

-2 
2

如果你想解析一個二進制值,你需要提供兩個基數或基數。

long foo = Long.parseLong(bin, 2); 

你可以看到在Java doc page一個例子:

parseLong("1100110", 2)回報102L

沒有基數,它使用base-10,並且1032將不適合long。請注意,對於一個32位字符串,這會給你無符號的變體。如果你想在一個long簽署的變種,您可以使用:

if (foo > 0x7fffffffL) foo = -(0x100000000L - foo); 

事後調整它

或者你可以用力將其轉換爲整數,如果這是合適的:

int foo = (int)Long.parseLong(bin,2); 

的要求Integer.parseInt()得到有符號數字表示它不適用於最左邊1位的32個字符的二進制字符串。

0

你是正確的 - 你需要使用 「長」 在這種情況下。

既然你正在做的二進制補碼(沒有的補),你可以使用「parseLong()」與「2」基數:

public class X { 

    public static void main (String[] args) { 
    String bin = "11111111111111111111111111111110"; 
    int i = (int)Long.parseLong(bin, 2); 
    System.out.println("parseInt(" + bin + ", 2)=" + i); 
    } 

} 
// Output: 
parseInt(11111111111111111111111111111110, 2)=-2 
相關問題