对于任何受范围R = [ x , y ] 限制的整数输入W,由于没有更好的术语,W超过R的“溢出”是。如果W超过y,这将导致它回绕。W % (y-x+1) + x
作为这个原则的一个例子,假设我们遍历一个日历的月份:
int this_month = 5;
int next_month = (this_month + 1) % 12;
其中两个整数都在 0 到 11 之间,包括 0 和 11。因此,上面的表达式将整数“钳制”在R = [0,11] 的范围内。这种使用表达式的方法简单、优雅且有利,因为它省略了分支。
现在,如果我们想做同样的事情,但反过来呢?以下表达式有效:
int last_month = ((this_month - 1) % 12 + 12) % 12;
但它很深奥。怎样才能美化?
tl;dr - 表达式((x-1) % k + k) % k
可以进一步简化吗?
注意:指定 C++ 标记是因为其他语言以不同方式处理模运算符的负操作数。