0

そのため、単純な 2 進数から 10 進数へのスクリプトに取り組んでいたところ、累乗で乗算すると精度が失われる可能性があるというエラーが発生しました。これが問題のコード ブロックです。バイナリの 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)

整数がオーバーフローしない限り、問題ありません。不必要doubleに s を使用しています。言うまでもなくMath.pow、2 のべき乗を計算する最も効果的で簡単な方法ではありません。

ところで、decimal()方法の要点はバイナリ文字列を解析することですか? もしそうなら、これを試してください:

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

はい、それだけです。

于 2012-04-24T22:00:07.533 に答える
1

doubleintを掛けて、値を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

オフバイワンエラーがあります。この関数は、本来あるべき値の 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;
}
于 2012-04-24T22:25:52.187 に答える