Javame関数を手伝ってください
-
27-10-2019 - |
質問
誰かが私にこの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)
これは、「丸みを帯びた」部門を行うためのより一般的な方法です(ただし、浮動小数点算術に依存しています)。
所属していません StackOverflow