在不使用 if 语句的情况下递减一个值并返回到最大值?
Decrementing a value and wrapping back to a max value without using if statement?
递增并返回到零很容易:
i = (i + 1) % Max;
但是递减并不是那么简单。基本上递减和包装你通常会找到这样的代码:
i--;
if (i < 0)
i = Max;
前面的代码不用if语句怎么写呢?
我知道可能会涉及位运算符。通常当我遇到这样的问题时,我会试着想出一些包含两项 A 和 B 的方程式,然后尝试找出这两项的实际值。例如:
i = A + B
如果 i
在 ]0, Max]
范围内,那么我们会得到:
i = 0 + B
和 B = i-1
否则如果i == 0
:
i = A + 0
和 A = Max
同样我们可以这样写:
i = i == 0 ? Max : i - 1;
如何在没有任何 ifs 或三元运算符的情况下写出前面的等式?我尝试了很多按位运算和不同的算术组合,但都无济于事。
有什么想法吗?
您可以修改它以适应您需要的范围
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;
<div id='counter'></div>
i = (Max-1 + i)%Max
只要 0<=i<Max
就有效。
递增并返回到零很容易:
i = (i + 1) % Max;
但是递减并不是那么简单。基本上递减和包装你通常会找到这样的代码:
i--;
if (i < 0)
i = Max;
前面的代码不用if语句怎么写呢?
我知道可能会涉及位运算符。通常当我遇到这样的问题时,我会试着想出一些包含两项 A 和 B 的方程式,然后尝试找出这两项的实际值。例如:
i = A + B
如果 i
在 ]0, Max]
范围内,那么我们会得到:
i = 0 + B
和 B = i-1
否则如果i == 0
:
i = A + 0
和 A = Max
同样我们可以这样写:
i = i == 0 ? Max : i - 1;
如何在没有任何 ifs 或三元运算符的情况下写出前面的等式?我尝试了很多按位运算和不同的算术组合,但都无济于事。
有什么想法吗?
您可以修改它以适应您需要的范围
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;
<div id='counter'></div>
i = (Max-1 + i)%Max
只要 0<=i<Max
就有效。