所以我正在研究一个简单的二进制到十进制脚本,并且在乘以幂时可能会丢失精度时发生错误。这是所讨论的代码块,它所做的只是将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;
}
答案 0 :(得分:4)
替换:
Math.pow(2,x.length()-a)
使用:
1 << (x.length() - a)
只要整数不溢出,你就会好起来的。您不必要地使用double
s,更不用说Math.pow
不是计算2的幂的最有效和直接的方法。
decimal()
方法解析二进制字符串的全部要点?如果是这样,试试这个:
public int decimal(String x){
return Integer.parseInt(x, 2);
}
是的,就是这样。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
您有一个错误的错误。该函数返回的值应该是应有的两倍。例如,decimal("1") == 2
。将其更改为Math.pow(2,x.length()-1-a)
。
但是由于结果是一个整数,所以最好用整数类型做所有事情,所以像其他人说的那样使用左移。
你甚至不需要计算两个人的权力。您可以每次将部分结果乘以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;
}