Necesito realizar algunas divisiones enteras en la ruta caliente de mi código. Ya he determinado a través de perfiles y recuento cíclico que las divisiones enteras me están costando. Espero que haya algo que pueda hacer para reducir las divisiones en algo más económico.¿Cómo puedo fuerza reducir la división en 2^n + 1?
En esta ruta, estoy dividiendo por 2^n + 1, donde n es variable. Esencialmente Quiero optimizar esta función para quitar el operador de división:
unsigned long compute(unsigned long a, unsigned int n)
{
return a/((1 << n) + 1);
}
Si estuviera dividiendo por 2^n, me basta con sustituir el div con un desplazamiento a la derecha por n. Si me estuviera dividiendo por una constante, dejaría que la fuerza del compilador reduzca esa división específica, probablemente convirtiéndola en una multiplicación y algunos cambios.
¿Hay una optimización similar que se aplique a 2^n + 1?
Editar: aquí puede ser un entero arbitrario de 64 bits. n toma solo unos pocos valores entre 10 y, digamos, 25. Ciertamente puedo calcular previamente algunos valores para cada n, pero no para a.
¿Hay algunas restricciones en los valores de a y n? –
¿Cuál es el contexto en el que llamas a la función? – GManNickG
'return a/lookup [n];' –