有没有办法只使用数学操作数(如mod)来实现这个非常简单的布尔逻辑?

Gre*_*nie 6 language-agnostic algorithm math

我想将值减一,如果它达到零,则将其设置为最大值.有没有办法通过数学来做到这一点而不诉诸if (n-1 == 0) { n = max; }

将值增加1然后在大于max时将其设置为零的相反情况可以很容易地实现n = (n + 1) % (max + 1);.此外,这甚至更好,因为你可以增加任何数量(不只是一个),它仍然会"正确""包裹".

谢谢你到目前为止的答案.要清楚,我的意思是没有任何布尔逻辑(if/else)或布尔运算符(!,&&等).我只是好奇如何做到这一点.只要提供评论,下面的正确答案是否真的让它更难以理解?对于更一般的情况,有必要使用它来减去任意数字并期望正确的环绕.

Ofi*_*fir 6

n = max - ((max - n +1)%max)
Run Code Online (Sandbox Code Playgroud)

  • 这回答了这个问题并提出了一个新问题:为什么用一个复杂的语句替换一个简单的语句来做同样的事情呢? (7认同)

Pau*_*l R 5

如果你纯粹出于性能原因这样做,那么我会反对它.%在大多数架构上通常都是相当昂贵的操作 - 简单的比较,分支和添加通常会更有效.当然,关于投机/过早优化的常见警告适用.

  • 通常需要注意的是,架构的变化很大,并且变化相当快,而且不是以可预测的方式.我已经放弃了尝试二次猜测除缓存局部性之外的任何东西. (3认同)