Помощь с функцией JavaME - PullRequest
       20

Помощь с функцией JavaME

2 голосов
/ 31 января 2011

Может ли кто-нибудь объяснить мне, как работает эта функция Java MIDP?Мне особенно интересно, какие операторы используются.

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

Большое спасибо

1 Ответ

3 голосов
/ 31 января 2011

Это алгоритм деления, который округляет до ближайшего целого числа.Это эквивалентно

Math.round((float) numerator / denominator)

для большого диапазона целых чисел, но реализовано с умом без операций с плавающей запятой.

Операторы << и >> являются побитовым сдвигомвлево и вправо операторы.


Вот интуиция, как это работает

Первое замечание, что << 16 и >> 16 эквивалентны * 65536 и / 65536 соответственно.Итак, алгоритм вычисляет следующее:

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

То есть он масштабирует числитель, делит его, добавляет половину шкалы, а затем снова уменьшает ее.

Этоаналогично выражению (int) ((numerator + 0.5) / denominator), которое является более распространенным способом «округленного» деления (но оно опирается на арифметику с плавающей запятой).

...