0

所以我正在研究一个简单的二进制到十进制脚本,并且在乘以幂时可能会丢失精度时发生错误。这是有问题的代码块,它所做的只是将二进制中的 1 和 0 乘以 2 的字符串长度的幂减去循环经过的迭代次数。然后将该结果添加到 z,并重复。

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z=z+Integer.parseInt(x.substring(a,a+1))*Math.pow(2,x.length()-a);
    }
    return z;
}
4

3 回答 3

4

代替:

Math.pow(2,x.length()-a)

和:

1 << (x.length() - a)

只要整数不溢出,你就可以了。您不必要地使用doubles,更不用说Math.pow它不是计算 2 的幂的最有效和最直接的方法。

顺便说一句,decimal()方法的重点是解析二进制字符串吗?如果是这样,试试这个:

public int decimal(String x){
  return Integer.parseInt(x, 2);
}

对,就是那样。

于 2012-04-24T22:00:07.533 回答
1

我相信您将double乘以int并将值存储在int中。一些铸造可能会解决它,试试这个;

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z=z+(int)(Integer.parseInt(x.substring(a,a+1))*Math.pow(2,x.length()-a));
    }
    return z;
}

并且按位命令将加速这一过程,并将完全消除强制转换的需要:

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z+=Integer.parseInt(x.substring(a,a+1)) << (x.length()-a);
    }
    return z;
}
于 2012-04-24T21:59:52.103 回答
0

你有一个错误。该函数返回一个两倍大的值。例如,decimal("1") == 2. 将其更改为Math.pow(2,x.length()-1-a).

但由于结果是一个整数,最好用整数类型做所有事情,所以像其他人所说的那样使用左移。

您甚至不必计算 2 的幂。您每次只需将部分结果乘以 2。

public int decimal(String x) {
    int z=0;
    for (int a = 0; a < x.length(); a++) {
        z = 2 * z + Integer.parseInt(x.charAt(a));
    }
    return z;
}
于 2012-04-24T22:25:52.187 回答