我需要在代码的热路径中执行一些整数除法。通过分析和计数周期,我已经确定了整数除法的成本。我希望有办法将这些除法强化以降低成本。
在这个路径中,我正在除以2^n+1,其中n是可变的。本质上,我想优化此函数以消除除法运算符:
unsigned long compute(unsigned long a, unsigned int n)
{
return a / ((1 << n) + 1);
}
如果我要进行2^n的除法,我可以将div更换为右移n位的操作。如果我要进行常量除法,我会让编译器对该特定除法进行强化优化,很可能会将其转化为一个乘法和一些移位操作。是否存在类似的优化适用于2^n+1?
编辑:这里的a可以是任意64位整数,n只取介于10到25之间的几个值。我当然可以为每个n预先计算一些值,但对于a则无能为力。
a
是一个64位整数,你应该声明它为这样。unsigned long
只保证有32位。使用uint64_t
或uint_least64_t
来表示它。对于1 << n
,如果你的n
可能会到达31
,那么你可能会有未定义的行为。请改用UINT64_C(1) << n
。 - Jens Gustedt