【发布时间】:2010-11-11 05:54:47
【问题描述】:
我有兴趣得到Euclidean除法的余数,即对于一对整数(i,n),求r如:
i = k * n + r, 0 <= r < |k|
简单的解决方案是:
int euc(int i, int n)
{
int r;
r = i % n;
if ( r < 0) {
r += n;
}
return r;
}
但是由于我需要执行数千万次(它在多维数组的迭代器中使用),所以我想尽可能避免分支。要求:
- 分支但更快也是可取的。
- 只适用于正 n 的解决方案是可以接受的(但它必须适用于负 i)。
- n 是事先不知道的,可以是任何值 > 0 和
编辑
实际上很容易得到错误的结果,所以这里是一个预期结果的例子:
- euc(0, 3) = 0
- euc(1, 3) = 1
- euc(2, 3) = 2
- euc(3, 3) = 0
- euc(-1, 3) = 2
- euc(-2, 3) = 1
- euc(-3, 3) = 0
有些人还担心优化这个没有意义。我需要一个多维迭代器,其中超出范围的项目被重复原始数组的“虚拟数组”中的项目替换。所以如果我的数组 x 是 [1, 2, 3, 4],虚拟数组是 [...., 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],比如x[-2]就是x1等...
对于维度为 d 的 nd 数组,我需要对每个点进行 d 欧几里得除法。如果我需要在 n^d 数组与 m^d 内核之间进行关联,我需要 n^d * m^d * d 欧几里得除法。对于 100x100x100 点的 3d 图像和 5*5*5 点的内核,这已经是约 4 亿欧几里得分割。
【问题讨论】:
-
N 是否总是正数 (>0),如您的示例所示?或者我们可能会遇到负 N 值?
-
对我来说,n 总是正数,是的。
-
带环绕的多维数组?嗯,甜甜圈:-)
-
所有的部门都使用相同的n吗?
-
标准 % 运算符有什么问题?真的太慢了吗?
标签: c bit-manipulation micro-optimization