J'ai besoin d'effectuer des divisions entières dans le chemin chaud de mon code. J'ai déjà déterminé via le profilage et le comptage de cycles que les divisions entières me coûtent. J'espère qu'il y a quelque chose que je peux faire pour réduire les divisions en quelque chose de moins cher.Comment puis-je réduire la division de 2^n + 1?
Dans ce chemin, je divise par 2^n + 1, où n est variable. Essentiellement, je veux optimiser cette fonction pour supprimer l'opérateur de division:
unsigned long compute(unsigned long a, unsigned int n)
{
return a/((1 << n) + 1);
}
Si je division par 2^n, je remplacerais juste le div avec un décalage à droite par n. Si je divisais par une constante, je laisserais la force du compilateur réduire cette division spécifique, la transformant probablement en une multiplication et quelques changements.
Y a-t-il une optimisation similaire qui s'applique à 2^n + 1?
Édition: il peut y avoir un entier arbitraire de 64 bits. n ne prend que quelques valeurs entre 10 et, disons, 25. Je peux certainement précalculer certaines valeurs pour chaque n, mais pas pour a.
Y a-t-il des contraintes qui pèsent sur les valeurs d'un et n? –
Dans quel contexte appelez-vous la fonction? – GManNickG
'retourner un/lookup [n];' –