通常,在我的内部循环中,我需要以“环绕”方式为数组建立索引,以便(例如)如果数组大小为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));
}
当然,我可以对它们进行概要分析以找出哪个是系统上最快的,但是我不禁担心自己可能错过了更好的系统,或者我的计算机上的速度在另一台计算机上可能较慢。
那么,有没有一种标准的方法来执行此操作,或者我错过了一些巧妙的技巧,而这可能是最快的方法?
另外,我知道这可能是一厢情愿的想法,但是如果有一种方法可以自动矢量化,那就太神奇了。