小编J.S*_*.S.的帖子

我怎样才能将分裂强度降低2 ^ n + 1?

我需要在代码的热路径中执行一些整数除法.我已经通过分析和循环计数确定了整数除法对我造成的损失.我希望我能做些什么来强化将分裂降低到更便宜的东西.

在这条路径中,我除以2 ^ n + 1,其中n是可变的.基本上我想优化此函数以删除除法运算符:

unsigned long compute(unsigned long a, unsigned int n)
{
    return a / ((1 << n) + 1);
}
Run Code Online (Sandbox Code Playgroud)

如果我除以2 ^ n,我只需用右移n替换div.如果我用常数除法,我会让编译器强度减少那个特定的除法,可能会把它变成乘法和一些变化.

是否存在适用于2 ^ n + 1的类似优化?

编辑:这里可以是任意64位整数.n只取10和25之间的几个值.我当然可以为每个n预先计算一些值,但不能为a计算.

c division integer-division strength-reduction

16
推荐指数
2
解决办法
839
查看次数