2012-12-23 21 views
1

我想一个十进制数转换为基体2回基地10.仅适用于正argument_decimal的Java转换负二进制回整数

argument_binary = Integer.toBinaryString(argument_decimal); 
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2); 

对于argument_decimal beeing负,我得到“java.lang.NumberFormatException:对于输入字符串: ”11111111111111111111111111111111“”

编辑:这是我做的:

latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000)); 
back_converted_latitude_decimal = Long.parseLong(latitude_binary, 2)/1000000.0; 

这给了我不好的结果就像是-1.1来回和背部转换为4293.867296

+0

你的意思是基地2和底座10,正确吗? – fge

+0

正确。抱歉混淆... – krzysiek

+0

你的输入字符串是33个字符,所以这并不奇怪; Java整数只涵盖32位。那么,真的有问题吗? – fge

回答

4

尝试通过长走:

String binary = Integer.toBinaryString(-1); 
long l = Long.parseLong(binary, 2); 
int i = (int) l; 

测试和工作。

为什么这样做是因为-1在系统内存中被表示为32位1的序列。使用toBinaryString方法时,它使用该确切表示形式创建一个字符串。但是,其中的32位实际上等于2^32 - 1.对于int(4个字节)来说这太大了,因为int是从[-2^31,2^31-1]开始的。这是因为最左边的位表示符号。所以要解决这个溢出问题,首先将1和0字符序列解释为Long。很长一段时间会这样做,因为长期的最大值是2^63-1。然后将long转换为int。这是通过简单地取低32位完成的。


在你的代码的错误是,你没有投中的Long.parseLong为int。所以这应该工作:

lat_bin = Integer.toBinaryString((int)(lat_dec * 1000000)); 
lat_dec_conv = ((int) Long.parseLong(lat_bin, 2))/1000000.0; 
+1

对于大于64位的数字,BigInteger。 – Confusion

+0

但在我的上下文中没有帮助(请参阅上面的代码) – krzysiek

+0

检查我的更新,我发现你的问题。 –

0
public static void convertStringToDecimal(String binary) { 
    int decimal = 0; 

    int power = 0; 

    if (binary.charAt(0) == '1' && binary.length() == 32) { 

     StringBuilder builder = new StringBuilder(); 

     for (int i = 0; i < binary.length(); i++) { 

      builder.append((binary.charAt(i) == '1' ? '0' : '1')); 

     } 

     while (binary.length() > 0) { 

      int temp = Integer 
        .parseInt(builder.charAt((binary.length()) - 1)+""); 
      decimal += temp * Math.pow(2, power++); 
      binary = binary.substring(0, binary.length() - 1); 

     } 

     System.out.println((decimal + 1) * (-1)); 

    } else { 

     while (binary.length() > 0) { 
      int temp = Integer 
        .parseInt(binary.charAt((binary.length()) - 1) + ""); 
      decimal += temp * Math.pow(2, power++); 
      binary = binary.substring(0, binary.length() - 1); 
     } 

     System.out.println(decimal); 

    } 
} 
+0

解释你的代码 –

+0

@MarlonAbeykoon第一个if语句检查传递的数字是否有其最左边的位等于'1',并且它的数字是负数。下一步是反转位并计算十进制表示。如果您对计算感到困惑,则必须查看[“two's complement”](https://en.wikipedia.org/wiki/Two's_complement)。希望能帮助到你 :) –