【问题标题】:Decrementing a value and wrapping back to a max value without using if statement?在不使用 if 语句的情况下减少值并返回最大值?
【发布时间】:2016-02-13 08:33:50
【问题描述】:

递增和回零很容易:

i = (i + 1) % Max;

但递减并不是那么直接。基本上要减少和包装你通常会发现这样的代码:

i--;
if (i < 0)
   i = Max;

如果不使用 if 语句,我们如何编写前面的代码?

我知道可能会涉及到按位运算符。通常,当我遇到此类问题时,我会尝试提出一些包含两项 A 和 B 的方程式,然后尝试找到这两项的实际值。例如:

i = A + B

如果i]0, Max] 范围内,那么我们会得到:

i = 0 + BB = i-1

否则如果i == 0:

i = A + 0A = Max

类似地我们可以这样写:

i = i == 0 ? Max : i - 1;

如何在没有任何 if 或三元运算符的情况下编写前面的等式?我尝试了很多按位运算和不同的算术组合,但无济于事。

有什么想法吗?

【问题讨论】:

  • 嗯,不是吗?那是行不通的。说Max = 10i = 0,然后i = -1 % 10 仍然等于-1

标签: c bit-manipulation bitwise-operators decrement


【解决方案1】:

你可以修改它以适应你需要的范围

var offset, 
    max = 10, 
    str = '', 
    counter = document.getElementById('counter');

for(var i = 0; i < (max * max); i++){
  offset = ((max + i) % max);
  str += (max - offset)+"<br/>";
}

counter.innerHTML = str;
&lt;div id='counter'&gt;&lt;/div&gt;

【讨论】:

  • 嗯,你能解释一下这是如何工作的吗?在我看来(max+i) % max 只是i % max,它为循环变量i 提供相同的值,所以offset = i 然后max - offsetmax - i。如果我将i &lt; Max*Max 更改为i &lt; Maxoffset = i,我会得到相同的输出。很抱歉没有看到这有什么帮助,也许我错过了一些明显的东西。我第一次看到这个“运行代码sn-p”功能!
【解决方案2】:
i = (Max-1 + i)%Max

只要0&lt;=i&lt;Max 就可以工作。

【讨论】:

  • 如果 Max > INTMAX/2 这可能会溢出,但适用于较小的 Max 值
  • 感谢您的回答。但是我想转回Max,这个转回Max - 1。但考虑到大多数用例是用于索引递减,通常最大值是数组的计数,我们希望返回到 count-1,在这种情况下,这非常有效。我尝试通过在整个结果中添加 + 1 来修改您的代码以换行到 Max,但现在 0 &lt; i &lt; Max 时它不会减少 i
  • 抱歉,我的答案是您的增量示例的精确减量模拟,(i+1)%Max。更仔细地阅读你的帖子的其余部分,看起来你想要的是(Max-i)%(Max+1),也就是说你想循环通过Max+1值Max,Max-1,...,0,Max,Max-1, ...
  • @Chris Dodd 是的,它也可能比 OP 提供的三元运算符代码慢,除非 Max(或者 Max+1)是 2 的幂..
  • 谢谢。对,所以我们也可以写i = (i - 1 + Max) % Max;,恕我直言。 (Max-i) % (Max+i) 呢?这背后的逻辑是什么?
猜你喜欢
  • 2013-12-04
  • 2022-09-29
  • 2013-05-29
  • 2017-11-22
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多