对于任何整数输入W,其范围限制为R=[x,y],则W超出R的"溢出",用缺乏更好术语的话来说,是W % (y-x+1) + x
。如果W超过y,它会回到范围的开头。
举个例子说明这个原理,假设我们遍历一个日历的月份:
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++标签是因为其他语言对于模运算符的负数操作数的处理方式不同。
((x-1) + k) % k
! - CpILL