2012-04-24 101 views
0

因此,我正在研究一个简单的二进制到十进制脚本,并且在乘以功率时可能会出现精度损失的情况。这是所讨论的代码块,它所做的只是将二进制中的1和0的值乘以字符串长度的大小减去循环所经历的迭代次数。然后将结果添加到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

替换:

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

有:

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

你会没事的ng作为整数不会溢出。您正在使用不必要double S,更何况Math.pow是不是计算的2

动力的最有效和最直接的方式就是BTW方法decimal()的整点是解析二进制字符串?如果是这样,试试这个:

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

是的,就是这样。

+0

整个问题的关键在于将二进制数转换为整数,再次感谢提及替换权力。 – jocopa3 2012-04-24 22:07:36

+2

@ jocopa3:如果你想像''10010“'这样的二进制转换为int(在这种情况下为18),我已经给了你一行代码,它更快,更安全,更易读。 – 2012-04-24 22:17:20

+0

+1:Math.pow非常昂贵,而转移是最便宜的操作。 – 2012-04-25 05:35:21

1

我相信你是通过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; 
} 
+0

谢谢,我从来没有听说过按位命令,我可能会研究它们。我也没有意识到你可以使用严格整数来获得双倍的结果。 – jocopa3 2012-04-24 22:04:35

+0

Math.pow返回一个double,就像大多数的Math一样。功能。 ** << **是一个'左移',它将int中的所有位移到左侧(保留2的补码签名,但不必太担心),这会使值的值加倍的int(二进制)类似于向数字中加零来乘以10(十进制) – lynks 2012-04-24 22:06:29

0

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

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

你甚至不必计算两个幂。您可以将部分结果每次乘以两倍。

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; 
}