通常在我的内部循环中,我需要以“环绕”方式索引一个数组,因此(例如)如果数组大小为 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));
}
当然,我可以分析这些以找出在我的系统上哪个是最快的,但我不禁担心我可能错过了一个更好的,或者我的机器上的快速可能在不同的机器上很慢。
那么有没有一种标准的方法来做到这一点,或者我错过的一些聪明的技巧可能是最快的方法?
另外,我知道这可能是一厢情愿的想法,但如果有一种方法可以自动矢量化,那就太棒了。