我有以下循环:
for (int ij = begin; ij < ni*nj; ij += step) {
int j = ij/ni;
int i = ij - j*ni;
...
}
在没有div / mod的情况下计算i,j
还有哪些其他选项?
展开循环是而不是一个选项。
答案 0 :(得分:5)
我使用两个变量。你必须使用除法和模数
之前可以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
。)
答案 1 :(得分:0)
只是一个简单的变量可能有用
即
int end = ni*nj;
并在for
循环中使用它。
答案 2 :(得分:0)
您可以执行以下操作
int k=0, j;
int temp = 1;
int result = 1;
do{
k++;
result = ni*k;
}
while(ni*k < ij);
j = result;
在此之后你可以用你正在做的方式计算我,因为你没有使用div / mod。