このMIDP Java関数がどのように機能するかを誰かに説明してもらえますか? 使用されている演算子について特に興味があります。
public static final int smoothDivide(int numerator, int denominator) {
return (int) ((numerator << 16) / denominator + 32768L) >> 16;
}
どうもありがとう
この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)
ます (ただし、浮動小数点演算に依存しています)。