2012-03-26 74 views
2

我有以下循环:更好倒塌循环指数计算

for (int ij = begin; ij < ni*nj; ij += step) { 
    int j = ij/ni; 
    int i = ij - j*ni; 
    ... 
} 

什么其他选择在那里计算i,j没有DIV/MOD?

展开循环是而不是一个选项。

+0

'ni'和'nj'是完全随意的吗? – 2012-03-26 08:00:23

+3

那么为什么折叠循环?为什么不嵌套循环?你测试过它慢吗? – 2012-03-26 08:00:53

+0

@ R.MartinhoFernandes是的,但他们很小,100或更小 – Anycorn 2012-03-26 08:19:57

回答

0

只是一个简单的变量可能是有用的

int end = ni*nj; 

,并使用在for循环。

+0

开销是迄今为止在整数除 – Anycorn 2012-03-26 07:55:30

+0

只是一个评论,计算每次进行循环。最好只做一次。 – 2012-03-26 09:54:11

5

我会使用两个变量。您必须在 beginstep(取决于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

我假设ij被用来索引数据。根据 数据是如何构成的,它可能是简单以添加begin到 它前面(如果你有一个指针),或迭代忽略begin, 在每个接入添加begin。 (如果你这样做,不要忘了来纠正 ninj相应。)

0

你可以做以下

int k=0, j; 
int temp = 1; 
int result = 1; 
do{ 
    k++; 
    result = ni*k; 
} 
while(ni*k < ij); 
j = result; 

在这之后,你可以计算出我自己在做,因为你以同样的方式没有使用div/mod。