Java将负二进制转换回整数

时间:2012-12-23 15:08:18

标签: java binary decimal negative-number

我正在尝试将基数为10的数字转换为基数2并返回到基数10.它仅适用于正数argument_decimal

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

对于argument_decimal beeing negative,我得到“java.lang.NumberFormatException:For input string:”11111111111111111111111111111111“”

编辑:这就是我的工作:

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

这给我带来了糟糕的结果,比如-1.1正在向后转换为4293.867296

2 个答案:

答案 0 :(得分: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 :(得分: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);

    }
}