这个问题已经在这里有了答案:




已关闭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为止。

也可以看看
  • Wikipedia/Modulo operation
  • 09-30 00:10