我有以下循环:更好倒塌循环指数计算
for (int ij = begin; ij < ni*nj; ij += step) {
int j = ij/ni;
int i = ij - j*ni;
...
}
什么其他选择在那里计算i,j
没有DIV/MOD?
展开循环是而不是一个选项。
我有以下循环:更好倒塌循环指数计算
for (int ij = begin; ij < ni*nj; ij += step) {
int j = ij/ni;
int i = ij - j*ni;
...
}
什么其他选择在那里计算i,j
没有DIV/MOD?
展开循环是而不是一个选项。
只是一个简单的变量可能是有用的
即
int end = ni*nj;
,并使用在for
循环。
开销是迄今为止在整数除 – Anycorn 2012-03-26 07:55:30
只是一个评论,计算每次进行循环。最好只做一次。 – 2012-03-26 09:54:11
我会使用两个变量。您必须在 begin
和step
(取决于step
可能有多大)之前,在 进入循环之前使用除法和模数,但在循环中它们不应该是必需的。如果 step
小于和ni
除数,那么下面应该做 的伎俩:
int end = ni;
int i = begin % ni;
int firstJ = begin/ni;
int j = firstJ;
while (i < ni) {
// ...
j += step;
if (j >= nj) {
++ i;
j = firstJ;
}
}
如果step
不是nj - firstJ
多,你就必须做一些 有关处理剩下的时j >= nj
。
我假设i
和j
被用来索引数据。根据 数据是如何构成的,它可能是简单以添加begin
到 它前面(如果你有一个指针),或迭代忽略begin
, 在每个接入添加begin
。 (如果你这样做,不要忘了来纠正 ni
和nj
相应。)
你可以做以下
int k=0, j;
int temp = 1;
int result = 1;
do{
k++;
result = ni*k;
}
while(ni*k < ij);
j = result;
在这之后,你可以计算出我自己在做,因为你以同样的方式没有使用div/mod。
'ni'和'nj'是完全随意的吗? – 2012-03-26 08:00:23
那么为什么折叠循环?为什么不嵌套循环?你测试过它慢吗? – 2012-03-26 08:00:53
@ R.MartinhoFernandes是的,但他们很小,100或更小 – Anycorn 2012-03-26 08:19:57