Лучшее вычисление индекса свернутого цикла - PullRequest
2 голосов
/ 26 марта 2012

У меня есть следующий цикл:

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

Какие есть еще варианты для вычисления i,j без div / mod?

развертывание цикла не вариант.

Ответы [ 3 ]

5 голосов
/ 26 марта 2012

Я бы использовал две переменные. Вам придется использовать деление и по модулю 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 соответственно.)

0 голосов
/ 26 марта 2012

Вы можете сделать следующее

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

После этого вы можете вычислить i так же, как вы делаете, потому что для этого вы не используете div / mod.

0 голосов
/ 26 марта 2012

Может пригодиться просто простая переменная

т.е.

int end =  ni*nj;

и используйте это в цикле for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...