这个问题已经在这里有了答案:
已关闭10年。
我想知道我要尝试的算法是否更好:
wrapIndex(-6,3)= 0
wrapIndex(-5,3)= 1
wrapIndex(-4,3)= 2
wrapIndex(-3,3)= 0
wrapIndex(-2,3)= 1
wrapIndex(-1,3)= 2
wrapIndex(0,3)= 0
wrapIndex(1,3)= 1
wrapIndex(2,3)= 2
wrapIndex(3,3)= 0
wrapIndex(4,3)= 1
wrapIndex(5,3)= 2
我想出了
函数wrapIndex(i,i_max){
如果(i> -1)
返回i%i_max;
var x = i_max + i%i_max;
如果(x == i_max)
返回0;
返回x;
}
有更好的方法吗?
最佳答案
此解决方案是无分支的,但是执行两次%
:
function wrapIndex(i, i_max) {
return ((i % i_max) + i_max) % i_max;
}
应该说是
%
的C#/ Java行为,即结果与被除数具有相同的符号。某些语言将余数计算定义为采用除数的符号(例如Clojure中的mod
)。某些语言有两种变体(Common Lisp,Haskell等中的mod
/ rem
对)。 Algol-68的%x
始终返回非负数。 C++将其留待实现直至C++ 11 now the sign of the remainder is (almost) fully specified according to the dividend sign为止。也可以看看