Мне нужно выполнить некоторые целые деления в горячем пути моего кода. Я уже определил с помощью профилирования и подсчета циклов, что целочисленные деления меня ценят. Я надеюсь, что что-то, что я могу сделать, чтобы прогнать дивизии во что-то более дешевое.
В этом пути я делясь на 2 ^ n + 1, где n - переменная. По сути, я хочу оптимизировать эту функцию, чтобы удалить оператор деления:
unsigned long compute(unsigned long a, unsigned int n)
{
return a / ((1 << n) + 1);
}
Если бы я разделил на 2 ^ n, я бы просто заменил div на shift-right на n. Если бы я делялся на константу, я бы позволил силе компилятора уменьшить это конкретное деление, вероятно, превратив его в умножение и некоторые сдвиги.
Существует ли аналогичная оптимизация, применимая к 2 ^ n + 1?
Изменить: здесь может быть произвольное 64-битное целое число. n принимает только несколько значений между 10 и, скажем, 25. Я могу, конечно, прекомпретировать некоторые значения для каждого n, но не для a.