是否有反向调制的简写?

时间:2017-01-20 20:18:56

标签: modular-arithmetic

假设我有数组索引0到5

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

的操作
i % 6

确保它永远不会超出索引范围。是否有缩减相同的简写符号?我一般都会问,不是特定于任何语言

我知道我能做到

if (i < 0) i = 5

3 个答案:

答案 0 :(得分:0)

在某些语言中,i % 6即使在递减时仍然可以工作 - 它们将负正%定义为正数,因此当我递减到-1时你得到5。

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

答案 1 :(得分:0)

如果您选择的语言支持用户定义类型的模运算,那么对模块化整数进行实施或取消将产生一个在该模数整数范围内的值。

Ada允许用户指定模块类型。您的问题的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中,这种循环缓冲区有时用于生产者/消费者模式。在这种情况下,有单独的读写索引,每次写入时检查缓冲区满状态,每次读取时检查缓冲区空条件。

答案 2 :(得分:0)

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