假设我有一个类似的零基范围
[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