如何用 % 运算符反转这个公式
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
始终在 0
和 n-1
之间,那么其他更简单的解决方案就足够了。如果您想要一种适用于任何 x
的方法,则需要更复杂的方法。
static int modulus(int x, int n)
{
return ((x % n) + n) % n;
}
第一个余数运算将值转换为 -n+1 ... n-1
范围。一旦我们添加 n
我们总是获得正值。然后最后的余数运算提供了预期的结果。
我有一个有 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
始终在 0
和 n-1
之间,那么其他更简单的解决方案就足够了。如果您想要一种适用于任何 x
的方法,则需要更复杂的方法。
static int modulus(int x, int n)
{
return ((x % n) + n) % n;
}
第一个余数运算将值转换为 -n+1 ... n-1
范围。一旦我们添加 n
我们总是获得正值。然后最后的余数运算提供了预期的结果。