在正数和负数的从零开始的范围内旋转



假设我有一个类似的零基范围

[0, 1, 2, 3, 4]

这些基本上是大小为5的数组的索引。是否可以使用带符号整数变量在该范围内连续向上或向下循环

通过向上或向下,我的意思是允许变量执行任意多次递增或递减操作

++index;
--index;
index += offset;
index -= offset;

因此,例如,递减索引应该映射到以下值:

index = 2;
while (/*...*/)
{
--index;
index_in_range(index, 5);
}

函数index_in_range(index, 5)将输出:

1, 0, 4, 3, 2, 1, 0, 4, 3, 2, 1, .... and so on

正的情况只是对范围大小的模运算,但对于负的情况,我不知道映射是如何进行的。

编辑:

所请求的函数index_in_range(int idx, int range)取任意整数,即可以称为index_in_range(-245, 14)。给出的例子确实使用了递减运算符,但我从未说过每次只偏移一个。

C做出了一个非常糟糕的决定,让%四舍五入为零,而不是一个简单的地板,所以数学计算比它必须的更笨拙。不过,基本上,你想要(index % size + size) % size。该代码从截断负倍数或正倍数开始,将索引带入范围(-size, size),添加size将其映射到(0,size*2),最后添加%将其映射为[0,size)

如果在编译时size是未知的,那么用条件index %= size; if(index < 0) index += size;替换第一个模数之后的所有内容可能更具性能。

增加

index = (index+1)%size;

降低

index = (index-1+size)%size

最新更新