我希望将变量减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);
我的问题:是否有任何优雅的方法使用,例如,按位运算符?
答案 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
。