1

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

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

4

2 回答 2

6

尝试走很长的路:

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

经测试,正常工作。

为什么这样做是因为 -1 在系统内存中表示为 32 位 1 的序列。使用 toBinaryString 方法时,它使用该精确表示创建一个字符串。但是,1 的 32 位实际上等于 2^32 - 1。这对于 int(4 字节)来说太大了,因为 int 来自 [-2^31, 2^31-1]。这是因为最左边的位代表符号。因此,要修复该溢出,首先将 1 和 0 字符的序列解释为 Long。long 会做,因为 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;
于 2012-12-23T15:21:34.130 回答
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);

    }
}
于 2016-12-18T11:32:41.677 回答