反向调制有shorthand吗?

Is there a shorthand for modulation in reverse?

假设我有数组索引 0 到 5

如果我在这个数组上递增一个计数器,我可以做类似

的事情
i % 6

确保它永远不会超出索引。是否有用于递减的同一事物的 shorthand 符号?我问的是一般情况,不特定于任何语言

我知道我能做到

if (i < 0) i = 5

在某些语言中,i % 6 即使在递减时仍然有效 - 他们将负数%正数定义为正数,所以当我递减到 -1 时你得到 5。

在任何语言中,无论您递增还是递减,(i + 6) % 6 都会保持在范围内。

如果您选择的语言支持 user-defined 类型的模运算,则递增或递减模整数将得到该模整数范围内的值。

A​​da 允许用户指定模块类型。您问题的 Ada 解决方案是

type Index_type is mod 6;
type Example is array(Index_Type) of Integer;

迭代数组,将其视为循环缓冲区,可以通过简单的循环完成

declare 
   I : Index_Type := 0;
   A : Example;
begin
   loop
      A(I) := some_value;
      I := I - 1;
   end loop;
end;

在循环中,我可以递增或递减,在这种情况下,算术总是以 6 为模。在 Ada 中,这种循环缓冲区有时以 producer/consumer 模式使用。在那种情况下,有单独的读取和写入索引,在每次写入时检查缓冲区满的情况,并在每次读取时检查缓冲区空的情况。

对于正整数n和non-negative计数器i,您可以将计数器模n的递增和递减定义为正整数值的算术运算。增量为i = (i + 1) % n,减量为i = (i + n - 1) % n.