反向调制有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 类型的模运算,则递增或递减模整数将得到该模整数范围内的值。
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 中,这种循环缓冲区有时以 producer/consumer 模式使用。在那种情况下,有单独的读取和写入索引,在每次写入时检查缓冲区满的情况,并在每次读取时检查缓冲区空的情况。
对于正整数n
和non-negative计数器i
,您可以将计数器模n
的递增和递减定义为正整数值的算术运算。增量为i = (i + 1) % n
,减量为i = (i + n - 1) % n
.
假设我有数组索引 0 到 5
如果我在这个数组上递增一个计数器,我可以做类似
的事情i % 6
确保它永远不会超出索引。是否有用于递减的同一事物的 shorthand 符号?我问的是一般情况,不特定于任何语言
我知道我能做到
if (i < 0) i = 5
在某些语言中,i % 6
即使在递减时仍然有效 - 他们将负数%正数定义为正数,所以当我递减到 -1 时你得到 5。
在任何语言中,无论您递增还是递减,(i + 6) % 6
都会保持在范围内。
如果您选择的语言支持 user-defined 类型的模运算,则递增或递减模整数将得到该模整数范围内的值。
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 中,这种循环缓冲区有时以 producer/consumer 模式使用。在那种情况下,有单独的读取和写入索引,在每次写入时检查缓冲区满的情况,并在每次读取时检查缓冲区空的情况。
对于正整数n
和non-negative计数器i
,您可以将计数器模n
的递增和递减定义为正整数值的算术运算。增量为i = (i + 1) % n
,减量为i = (i + n - 1) % n
.