我有以下循环:
for (int ij = begin; ij < ni*nj; ij += step) {
int j = ij/ni;
int i = ij - j*ni;
...
}
还有哪些其他选项可以在没有 div/mod 的情况下计算
i,j
?展开循环不是一种选择。
最佳答案
我会使用两个变量。你必须使用除法和取模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
相应。)关于c++ - 更好的折叠循环索引计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9868332/