【问题标题】:Java converting negative binary back to integerJava将负二进制转换回整数
【发布时间】:2012-12-10 07:47:54
【问题描述】:

我正在尝试将一个以 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:对于输入字符串:“1111111111111111111111111111111””

编辑:这是我的工作:

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

这给了我不好的结果,比如 -1.1 来回转换为 4293.867296

【问题讨论】:

  • 你的意思是基数 2 和基数 10,对吗?
  • 正确。很抱歉造成混淆...
  • 你输入的字符串是33个字符,所以这并不奇怪; Java 整数仅涵盖 32 位。那么,真的有问题吗?
  • 我的 argument_decimal 是“-1”,我没有手动将 argument_binary 设置为 33,如果这是你的建议的话......
  • 用我蹩脚的英语来描述它的上下文要复杂得多;)...我只需要它...

标签: java binary decimal negative-number


【解决方案1】:

尝试走长路:

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;

【讨论】:

  • 对于大于 64 位的数字,BigInteger
【解决方案2】:
 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);

    }
}

【讨论】:

  • @MarlonAbeykoon 第一个 if 语句检查传递的数字是否其最左边的位等于 '1',如果数字为负数。下一步是反转位并计算十进制表示。如果您对计算感到困惑,您必须查看 "two's complement" 。希望它有所帮助:)
猜你喜欢
  • 2017-07-13
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多