C 是否在不使用if语句的情况下递减值并换回最大值?

C 是否在不使用if语句的情况下递减值并换回最大值?,c,bit-manipulation,bitwise-operators,decrement,C,Bit Manipulation,Bitwise Operators,Decrement,递增并换回零很容易: i = (i + 1) % Max; 但递减并不是那么简单。基本上,对于减量和换行,您通常会发现如下代码: i--; if (i < 0) i = Max; 如果i在]0,Max]范围内,则我们将得到: i=0+B和B=i-1 否则,如果i==0: i=A+0和A=Max 同样,我们可以写: i = i == 0 ? Max : i - 1; 如何在没有ifs或三元运算符的情况下写出前面的方程?我尝试了很多位操作和不同的算术组合,但都没有成功 有什么想法吗

递增并换回零很容易:

i = (i + 1) % Max;
但递减并不是那么简单。基本上,对于减量和换行,您通常会发现如下代码:

i--;
if (i < 0)
   i = Max;
如果
i
]0,Max]
范围内,则我们将得到:

i=0+B
B=i-1

否则,如果
i==0

i=A+0
A=Max

同样,我们可以写:

i = i == 0 ? Max : i - 1;
如何在没有ifs或三元运算符的情况下写出前面的方程?我尝试了很多位操作和不同的算术组合,但都没有成功


有什么想法吗?

您可以根据需要修改它

var偏移量,
最大值=10,
str='',
计数器=document.getElementById('counter');
对于(变量i=0;i<(max*max);i++){
偏移量=((最大+i)%max);
str+=(最大偏移量)+“
”; } counter.innerHTML=str

只要
0um就可以工作,不是吗?那不行。说
Max=10
i=0
,然后
i=-1%10
这仍然等于
-1
,如果Max>INTMAX/2,这可能会溢出,但是对于较小的Max值很好。谢谢回答。然而,我想返回到
Max
,这将返回到
Max-1
。但是考虑到大多数使用情况都是索引递减,通常max是数组的计数,我们希望返回到count-1,在这种情况下,这非常有效。我试图通过在整个结果中添加+1来修改代码,使其换行为
Max
,但现在当
0
时,它不会递减
I
,对不起,我的答案是增量示例的精确递减模拟,
(I+1)%Max
。更仔细地阅读你的文章的其余部分,看起来你想要的是
(Max-i)%(Max+1)
,也就是说你想要在
Max+1
值Max,Max-1,…,0,Max,Max,Max-1,…@Chris Dodd是的,它也可能比OP呈现的三元运算符代码慢,除非Max(或者它是Max+1)是二的幂,谢谢。对,所以我们也可以写
i=(i-1+Max)%Max哪个更清楚一点。那么
(Max-i)%(Max+i)
呢?这背后的逻辑是什么?嗯,你能解释一下这是怎么回事吗?在我看来,
(max+i)%max
只是
i%max
,它为循环变量
i
提供了相同的值,因此
offset=i
,然后
max-offset
就是
max-i
。如果我将
I
更改为
I
offset=I
,我将得到相同的输出。很抱歉看不出这有什么帮助也许我遗漏了一些明显的东西。我喜欢“运行代码片段”功能,这是我第一次看到它!
i = i == 0 ? Max : i - 1;
i = (Max-1 + i)%Max