質問

誰かが私にこのMIDP Java機能がどのように機能するかを説明できますか?私は使用されているオペレーターに特に興味があります。

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

どうもありがとう

役に立ちましたか?

解決

これは、最も近い整数に丸められる分割アルゴリズムです。相当します

Math.round((float) numerator / denominator)

整数の幅広い範囲の場合、しかし、クリーブリーは浮動点操作なしで実装されました。

オペレーター <<>> それは ビットワイズシフト左にシフトし、右にシフトします オペレーター。


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

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

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

つまり、分子をスケーリングし、それを分割し、スケールの半分を追加し、再びスケーリングします。

表現に似ています (int) ((numerator + 0.5) / denominator) これは、「丸みを帯びた」部門を行うためのより一般的な方法です(ただし、浮動小数点算術に依存しています)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top