我的教授不喜欢使用取模运算,因为它不够高效,但我不确定如何使用逻辑运算符或其他方法得到同样的答案。有人可以帮我解决如何做吗?
j = (j + 1) % a.length;
我的教授不喜欢使用取模运算,因为它不够高效,但我不确定如何使用逻辑运算符或其他方法得到同样的答案。有人可以帮我解决如何做吗?
j = (j + 1) % a.length;
int k = a.length;
int d = (j+1)/k;
j = (j+1) - d*k
如果没有取模的话,我唯一能想到的办法仍然不是很好:
j = (++j < a.length)? j : (j - a.length);
更易读的方式如下:
j++;
j = (j < a.length)? j : (j - a.length);
或者
j++;
if (j >= a.length) {
j -= a.length;
}
j < a.length
通常情况下也是成立的(除非a.length <= 2
,这似乎不太可能)。j++;
if(j < a.length) {
}
else {
j -= a.length;
}
如果j
的初始值超出了范围0
到a.length
(包括0但不包括a.length),那么唯一的解决方案要么使用模数或除法,这两种操作速度相同;要么使用减法循环,这实际上与早期处理器上的模数运算基本相同,而目前我所知道的任何处理器上的内置模数运算都比它快。
j
的大小并不重要,只有它与 a.length
的比较才是关键。这个解决方案(和其他大多数解决方案一样)假设 j
始终保持在 0
和 a.length
之间(包括左端点,不包括右端点),因为如果没有使用 divmod 操作或者以更低效的方式实现这样的操作,就无法完成此操作。 - qaphlaj = j + 1;
if (j >= a.length) {
j = j - a.length; // assumes j was less than length before increment
}
j = j + 1;
if (j >= a.length) { // assumes j was less than length before increment
j = 0;
}
j = j + 1;
while (j >= a.length) {
j = j - a.length;
}
%
也是一种不错的方法。除非你的教授要求不用它。if (j >= a.length)
。 - ajbif (j >= a.length) j = 0;
。有时这样会更清楚地表明正在发生什么。 - ajb想一想你在做什么。实际上,你正在说:
if j + 1 is smaller than a.length, set j to j + 1
otherwise, we set j to a value smaller than a.length