繁体   English   中英

递减和模数 - 如何在一行代码中减少负值

[英]decrementation and modulo - how to decrement negative value in one line of code

我发现增加有限变量的方法非常温和,只需:

++i %= range;

不幸的是,这个技巧不适用于减量,因为-1 % v == -1

如何在C ++中改进这一点?

为了避免负模数行为,您可以先将其设为正数:

i = (i - 1 + range) % range;

但是,如果range大于INT_MAX的一半,这是不好的。 (或者i任何类型)。

这似乎更简单:

i = (i ? i : range) - 1;

我的理解是你想要相同的[0,范围]区间,你只想按降序顺序浏览它。

在任意时期内做的相当复杂,但对于2的幂(不需要是常数),你可以使用

--i; i &= unsigned(range - 1);

这类似于正面版本的“优化”,

++i; i &= unsigned(range - 1);

在任意范围内执行此操作的一种简单方法是使用第二个变量

++tmp; i = range - 1 - (tmp %= range);

此代码应该适用于通过区间[0,范围]递减i

--i = (i > 0) * (i % range);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM