“溢出减法”的公式

问题描述

假设我要递增或递减一个索引,我将使用该索引在数组中移动。

数组从索引 0 开始,到索引 4 结束。如果我在索引 0 处并且想要移回 1 个索引,我应该在索引 4 处结束(环绕)。

这可能非常简单,但出于某种原因,我无法想出一个公式来给出这个结果。 “环绕加法”非常简单:索引 % 5 + 1,但我就是不知道减法。

解决方法

正确的加法公式是(index + 1) % 5。当 index 为 4 时,您的版本给出了错误的结果。

正确的减法公式取决于 % 运算符在您使用的语言中的行为:

  • 在 Python 中,(index - 1) % 5 是正确的,因为即使左侧为负数,% 也能保证结果介于 0 和 4 之间。
  • 在 C 和 Java 中,(index + 4) % 5 是正确的,因为当左侧为负数时,% 将返回负余数。请注意,此公式也适用于 Python。

更多讨论见this other Q&A

,

公式

newindex = (index + increment + arraylen) % arraylen

适用于增量 +1-1(向前和向后移动)。

arraylen = 5 在您的示例中