Я предпочитаю условный подход, даже если мы используем тип unsigned , операция по модулю имеет недостатки. Использование по модулю имеет плохой побочный эффект, когда проверяемое число возвращается к нулю
Пример:
255 % 7 == 3
Таким образом, если вы используете, например, байт (символ без знака), когда число катится после 255 (то есть ноль), это не приведет к 4. Должно привести к 4 (при 256% 7), поэтому он вращается правильно. Так что просто используйте тестирующие (if
и ternary operator
) конструкции на правильность
Если для достижения производительности, и , если число кратно 2 (то есть 2, 4, 8, 16, 32, 64, ...), используйте оператор &
.
Так, если длина буфера равна 16, используйте:
n & 15
Если длина буфера равна 64, используйте 63:
n & 63
Они вращаются правильно, даже если число возвращается к нулю. Кстати, если число кратно 2, даже подход по модулю / остатку также будет соответствовать требованиям, т. Е. Он будет правильно вращаться. Но я могу рискнуть предположить, что &
операция быстрее, чем %
операция.