2

このMIDP Java関数がどのように機能するかを誰かに説明してもらえますか? 使用されている演算子について特に興味があります。

public static final int smoothDivide(int numerator, int denominator) {
    return (int) ((numerator << 16) / denominator + 32768L) >> 16;
}

どうもありがとう

4

1 に答える 1

3

これは、最も近い整数に丸める除算アルゴリズムです。と同等です

Math.round((float) numerator / denominator)

整数の広い範囲に対応しますが、浮動小数点演算なしで巧妙に実装されています。

演算子<<>>は、ビットごとの左シフト演算子と右シフト演算子です。


これがどのように機能するかの直感です

最初に、とがそれぞれ<< 16>> 16に相当することに注意してください。したがって、アルゴリズムが計算するのは次のとおりです。* 65536/ 65536

            / numerator * 65536           \
result  =  ( ------------------  +  32768  )  /  65536
            \   denominator               /

つまり、分子をスケールアップし、それを割り、スケールの半分を追加してから、再びスケールダウンします。

これは、「丸められた」除算を行うためのより一般的な方法である式に似てい(int) ((numerator + 0.5) / denominator)ます (ただし、浮動小数点演算に依存しています)。

于 2011-01-31T09:53:26.070 に答える