Я узнал об этом трюке на днях, проверив машинный код, сгенерированный gcc. Деление целого числа a
на константу b
можно оптимизировать следующим образом:
x = a / b
x = a * (1 / b)
x = (a * (((1 << n) / b) + 1)) >> n
Обратная величина может быть оценена во время компиляции, что приводит к операции умножения и сдвига, которая более эффективна, чем деление.
c = ((1 << n) / b) + 1
x = (a * c) >> n
Теперь это имеет тот же эффект, что и простое целочисленное деление, оно усекает результат (округление до нуля). Можно ли изменить этот алгоритм для округления до ближайшего значения вместо этого?