如何用 % 运算符反转这个公式

How invert this formula with % operator

我有一个有 5 个状态的信号量变量。

我可以用这个圆环提升状态

X = (X + 1) % 5

For X = {0, 1, 2, 3, 4} generate {1, 2, 3, 4, 0}.

但如果我尝试从另一个方向降低状态,则不会带来正确的结果。

X = (X - 1) % 5

For X = {0, 1, 2, 3, 4} generate {-1, 0, 1, 2, 3} insted of {4, 0, 1, 2, 3}

例如在 excel 中,如果你尝试 =MOD(-1;5) 你会得到 4。

而不是

X = (X - 1) % 5

使用

X = (X + 4) % 5

这是

的缩写形式
X = (X - 1 + 5) % 5

或通常

X = (X - 1 + n) % n

这确保 () 中的参数始终为正 - 因此除法余数也保持为正。

问题是由于C# supports remainder operator而不是取模运算符

引起的

如果您的 x 始终在 0n-1 之间,那么其他更简单的解决方案就足够了。如果您想要一种适用于任何 x 的方法,则需要更复杂的方法。

static int modulus(int x, int n)
{
    return ((x % n) + n) % n;
}

第一个余数运算将值转换为 -n+1 ... n-1 范围。一旦我们添加 n 我们总是获得正值。然后最后的余数运算提供了预期的结果。