通常在我的内部循环中,我需要以“环绕”的方式索引一个数组,这样(例如)如果数组大小为100,并且我的代码要求元素 -2,那么它应该被赋予元素98。在许多高级语言(如 Python)中,人们只需使用 my_array[index % array_size]
就可以做到这一点,但出于某种原因,C 的整数算法(通常)向零舍入,而不是始终向下舍入,因此当给定负的第一个参数时,它的模运算符返回负结果。
通常我知道 index
不会小于 -array_size
,在这些情况下我只做 my_array[(index + array_size) % array_size]
。然而,有时这是不能保证的,对于这些情况,我想知道最快的方法来实现一个总是正的模函数。有几种不使用分支的“聪明”方法,例如
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n;
}
或者
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0));
}
当然,我可以对它们进行分析,以找出在我的系统中哪个是最快的,但是我不禁担心我可能错过了一个更好的,或者在我的机器上最快的东西在另一个机器上可能会慢下来。
那么有没有一种标准的方法来做这件事,或者一些我错过的可能是最快可能的方法的聪明的技巧呢?
另外,我知道这可能是一厢情愿的想法,但如果有一种方法可以做到这一点,可以自动向量化,这将是惊人的。