2012-04-24 8 views
0

私は10進数のスクリプトに単純なバイナリを使用していましたが、電源を掛けたときに精度が低下する可能性がある場所でエラーが発生しました。これは問題のコードブロックであり、2と2の2進数の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。あなたは不必要Math.powdecimal()方法の全体のポイントは、バイナリ文字列を解析することであるBTWある2

の力を計算するための最も効果的かつ簡単な方法ではありませんもちろんのこと、double Sを使用していますか?もしそうなら、これを試してみてください。

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

はい、それはそれです。

+0

全体のポイントはバイナリを整数に変換することでした。 – jocopa3

+2

@ jocopa3: '" 10010 "'のようなバイナリをint(この場合は18)に変換したい場合、私はあなたに一行を与えました。これはずっと速く、より安全で読みやすいです。 –

+0

+1:Math.powは非常に高価ですが、shiftは最も安い操作です。 –

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

+0

Math.powは、Mathの大部分と同様に、倍精度を返します。機能。 ** << **は左シフトです(intの左辺に2ビットの補数を保持しますが、あまり心配しないでください)、これは値を2倍にする効果があります数値に0を加えることは10(10進)を乗算するのと同じようにint(バイナリ)の値を返します。 – lynks

0

オフラインでエラーが発生しました。この関数は、必要な値の2倍の値を返します。例えば、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; 
} 
関連する問題