Единственный способ, которым я могу видеть, делать это без по модулю еще не велика:
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;
}
Кроме того, я не совсем уверен о том, как Java делает с предсказанием цикла, но по крайней мере на C, следующее будет немного лучше для скорости, если оно менее читаемо, поскольку общее предположение состоит в том, что аргумент для оператора if будет истинным, а j < a.length
чаще, чем нет (Если a.length <= 2
, который не кажется маловероятным.)
j++;
if(j < a.length) {
}
else {
j -= a.length;
}
Если начальное значение j
находится вне диапазона 0
до a.length
(включительно эксклюзивные), то единственное решение либо использовать модуль или деление, которое, будучи таким же работающие, имеют одинаковую скорость или цикл вычитания, который будет по существу выполнять то же самое, что и модуль на очень старом процессоре, который медленнее, чем встроенная операция для модуля на любом текущем пр. о котором я знаю.
* sighs * у профессора –
Вы можете сделать это с условным (если 'j' уже'
Согласен.Проблемы профессора не являются обоснованными. За исключением специализированного приложения, modulo обычно быстрее, чем условный переход на многих языках, и даже если он медленнее, эта микрооптимизация по-прежнему на порядок медленнее, чем доступ к диску или сетевые задержки. – hexafraction