如何从数学运算中删除模数?

use*_*056 5 java modulo

我的教授不喜欢模数的使用,因为它不够有效,但我不确定如何使用逻辑运算符或其他东西得到相同的答案.有人可以帮我解决这个问题吗?

j = (j + 1) % a.length;
Run Code Online (Sandbox Code Playgroud)

Lee*_*dor 2

你可以这样做:

j = j + 1;
if (j >= a.length) {
    j = j - a.length; // assumes j was less than length before increment
}
Run Code Online (Sandbox Code Playgroud)

@ajp 建议了另一种实际上可以正常工作的解决方案。

j = j + 1;
if (j >= a.length) { // assumes j was less than length before increment
    j = 0; 
}
Run Code Online (Sandbox Code Playgroud)

如果我正在编写代码,我会这样写,以防万一。它几乎没有额外的开销,并且消除了“假设”

j = j + 1;
while (j >= a.length) {
    j = j - a.length;
}
Run Code Online (Sandbox Code Playgroud)

当然,这%也是一个很好的方法。除非是你的教授。

这可能比除法/取模更快或更慢,具体取决于跳转的成本(以及对指令管道/前瞻的任何影响)和整数除法指令的效率。

旧处理器可能会因跳跃而做得更好。更现代的有鸿沟。

  • 如果这比使用模数慢,那么您可能无法得到比您所拥有的更好的结果,除非您对某个特定数字(例如 2 的幂)进行模数运算。 (3认同)