将无符号整数减1

时间:2014-04-04 20:24:48

标签: c

我希望将变量减1,而变量不等于0.一旦此变量为零,它必须返回初始值。

例如:

如果初始值为3,则不同的值为:

  3 2 1 0 3 2 1 0...

这是我的代码:

unsigned int i = 3;
do {
  if (i != 0)
  {
    i--;
  } 
  else
  {
    i=3;
  }      
while (1);

我的问题:是否有任何优雅的方法使用,例如,按位运算符?

5 个答案:

答案 0 :(得分:4)

您要执行的操作非常简单:如果i为0,则将其设置为3,否则将其递减。

您的代码应尽可能清楚地表达该操作。你问题中的代码做得相当好。

你也可以使用%余数运算符,但是如果周期长度不是2的幂,那么它可能会施加太大的开销(因为它恰好在此情况)。

我很想更简洁地编写代码:

i = (i==0 ? 3 : i-1);

很容易被带走并编写看起来像行噪声的代码(代码速度与表达式中的字符数相关),但在这种情况下我认为条件算子足够清楚。

答案 1 :(得分:3)

由于您明确要求按位运算符,所以:

i=(i-1) & 0x03;

应该做的伎俩。只有在想要看到的第一个数字是2,4,8,16,32 ......时才有效...

答案 2 :(得分:2)

使用模运算

i = (i+3) % 4

答案 3 :(得分:0)

应该很简单:

i = (i+3)%4

答案 4 :(得分:0)

为什么不是这样的东西,没有分区或条件分支(while除外):

#include <limits.h>
...
unsigned int  cnt = UINT_MAX ;
unsigned char i   ;
while ( 1 )
{
  i = 0x00000003U & (cnt--) ;
  do_something_useful(i) ;
}

非常确定你会得到严格的代码,只需加载一个UINT_MAX的寄存器,并使用适当的值循环填充i