Как вы выполняете итерацию назад по круговому буферу без условного выражения?

Итерация вперед через циклический буфер без использования условного оператора легко выполняется с оператором остатка...

iterator = (iterator + 1) % buffer_size;

Я не могу на всю жизнь понять обратную операцию, итерацию назад.


person Nick Strupat    schedule 09.08.2010    source источник
comment
это не просто, buffer_size - (iterator + 1) % buffer_size - 1?   -  person Anycorn    schedule 09.08.2010


Ответы (2)


iterator = (iterator + buffer_size - 1) % buffer_size вам подходит? Пройдите на один меньше, чем все вокруг.

person Borealid    schedule 09.08.2010

Ответ Borealid работает. (примечание: iterator изначально установлено на 0).

Другое решение

iterator = buffer_size - 1 - (buffer_size - iterator) % buffer_size с iterator изначально установленным на buffer_size.

person Omair    schedule 09.08.2010