如何使用%运算符反转此公式

本文关键字:何使用 运算符 | 更新日期: 2023-09-27 17:56:20

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

我可以使用这个 cicle 增加状态

X = (X + 1) % 5
对于 X = {0, 1, 2, 3, 4},

生成 {1, 2, 3, 4, 0}。

但是,如果我尝试朝另一个方向减少状态,就不会带来正确的结果。

X = (X - 1) % 5
对于 X = {0, 1, 2, 3, 4},生成 {-1, 0, 1, 2,

3} 而不是 {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# 支持余数运算符而不是模运算符引起的。

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

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

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