如果将一个数自加到某个值清零?

[复制链接]
1575|12
 楼主| hzocce 发表于 2016-5-29 19:29 | 显示全部楼层 |阅读模式
我看到别人一个代码,意思是一个变量一直自加,然后与上那个数,就清零了。
原代码是:
unsigned char Temp=0;
Temp++;
Temp=Temp & 0x07;
意思是将Temp自加到8时,清零。

我的做法是:unsigned char Temp=0;
Temp++;
if(Temp==0x08)Temp=0;我仅会使用这种,简单易懂。


看他的意思,难道自加到某个数清零的时候,是不是与上比这个数小一位就可以了?
这样做可行?

另外也有看到,将某个数对一个数求模,Temp%=0x08;
ayb_ice 发表于 2016-5-29 19:35 来自手机 | 显示全部楼层
意思就是用最低的3位计数
 楼主| hzocce 发表于 2016-5-29 22:19 | 显示全部楼层
ayb_ice 发表于 2016-5-29 19:35
意思就是用最低的3位计数

楼上的兄弟,这个啥意思?
meancom 发表于 2016-5-29 23:03 | 显示全部楼层
效果是一样的,Temp=Temp&0x07 的效率最高,一般单片机都是一个系统指令周期完成。PS:if(Temp==0x08)这种做法不规范,最好是使用if(Temp >= 0X08) 防止某些时候因为意外导致Temp超过 0X08,如果Temp用于一些数据地址的读取基本上都会产生死机情况的。
mcu5i51 发表于 2016-5-30 07:47 | 显示全部楼层
Temp = Temp & 0x07
tmp &= 0x07
tmp &= 0b00000111
tmp = 0-7
tmp &= 0xf
tmp &= 0b00001111
tmp = 0-15
dongshan 发表于 2016-5-30 08:10 | 显示全部楼层
Temp = (Temp+1)%8
linqing171 发表于 2016-5-30 09:50 | 显示全部楼层
mcu5i51 发表于 2016-5-30 07:47
Temp = Temp & 0x07
tmp &= 0x07
tmp &= 0b00000111

一看就是FPGA人员想学下C语言。
没有分号,0b开头,已经深深的出卖了你。

如果keil情况下,与运算最快。取余数需要除法。
ARM情况下先左移再右移也没有慢多少。
mohanwei 发表于 2016-5-30 10:06 | 显示全部楼层
现在绝大部分场合都是性能过剩的,建议尽量用最简单易懂的写法,不给自己和后续的维护者添麻烦……
NE5532 发表于 2016-5-30 10:26 | 显示全部楼层
人家玩了个技巧,比如只计数到7,就与上0x08,自加到8,然后一与,不就回0了?这是个特例,只有最终数值在0x80、0x40、0x20……这些数的时候可以用(规律自己找)。不是任何数据都可以这样写的。
lr_xgm 发表于 2016-5-30 10:40 | 显示全部楼层
条条大路通罗马,至于怎么写,就看自己对代码运行效率的控制
coody 发表于 2016-5-30 11:32 | 显示全部楼层
楼主的程序;
Temp++;
if(Temp==0x08)Temp=0;

那么,如果什么原因temp=9,结果会怎样?

沙发说的对,就是用最低的3位计数
mcu5i51 发表于 2016-5-30 14:25 | 显示全部楼层
linqing171 发表于 2016-5-30 09:50
一看就是FPGA人员想学下C语言。
没有分号,0b开头,已经深深的出卖了你。

仁兄好像这次错了,FPGA还没有好好学习一下;
之所以没有加上分号是因这本就不是一个完整的语句,
只是一步步分析如何做的
 楼主| hzocce 发表于 2016-6-8 08:52 | 显示全部楼层
那还是用   if(Temp>=0x08)Temp=0   ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

617

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部