Это алгоритм деления, который округляет до ближайшего целого числа.Это эквивалентно
Math.round((float) numerator / denominator)
для большого диапазона целых чисел, но реализовано с умом без операций с плавающей запятой.
Операторы <<
и >>
являются побитовым сдвигомвлево и вправо операторы.
Вот интуиция, как это работает
Первое замечание, что << 16
и >> 16
эквивалентны * 65536
и / 65536
соответственно.Итак, алгоритм вычисляет следующее:
/ numerator * 65536 \
result = ( ------------------ + 32768 ) / 65536
\ denominator /
То есть он масштабирует числитель, делит его, добавляет половину шкалы, а затем снова уменьшает ее.
Этоаналогично выражению (int) ((numerator + 0.5) / denominator)
, которое является более распространенным способом «округленного» деления (но оно опирается на арифметику с плавающей запятой).