Вот так, "элементарный вопрос" превращается в неразрешимую задачу.
К слову, работающее арифметическое решение, вот:
Синтаксис:
Используется csharp
int f = i < 0 ? length - System.Math.Abs(i%length):i%length;
f = f == length ? 0 : f;
f = f == length ? 0 : f;
Только я как-то не уверен, что оно реально оптимальнее изначального:
Синтаксис:
Используется csharp
while (x > size - 1)
x = x - size;
while (x < 0)
x = x + size;
x = x - size;
while (x < 0)
x = x + size;
Которое при определённых условиях, можно сфейковать и до такого: (не уверен, насколько это критично в плане производительности)
Синтаксис:
Используется csharp
if (x > size - 1)
x = x - size;
else if (x < 0)
x = x + size;
x = x - size;
else if (x < 0)
x = x + size;
"Одно/два сравнения и опциональное вычитание/сложение", против "двух сравнений, деления по остатку и опционального вычитания с вызовом системной функции".
Хм..