打印

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

[复制链接]
1031|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用于一些数据地址的读取基本上都会产生死机情况的。

使用特权

评论回复
5
mcu5i51| | 2016-5-30 07:47 | 只看该作者
Temp = Temp & 0x07
tmp &= 0x07
tmp &= 0b00000111
tmp = 0-7
tmp &= 0xf
tmp &= 0b00001111
tmp = 0-15

使用特权

评论回复
6
dongshan| | 2016-5-30 08:10 | 只看该作者
Temp = (Temp+1)%8

使用特权

评论回复
7
linqing171| | 2016-5-30 09:50 | 只看该作者
mcu5i51 发表于 2016-5-30 07:47
Temp = Temp & 0x07
tmp &= 0x07
tmp &= 0b00000111

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

如果keil情况下,与运算最快。取余数需要除法。
ARM情况下先左移再右移也没有慢多少。

使用特权

评论回复
8
mohanwei| | 2016-5-30 10:06 | 只看该作者
现在绝大部分场合都是性能过剩的,建议尽量用最简单易懂的写法,不给自己和后续的维护者添麻烦……

使用特权

评论回复
9
NE5532| | 2016-5-30 10:26 | 只看该作者
人家玩了个技巧,比如只计数到7,就与上0x08,自加到8,然后一与,不就回0了?这是个特例,只有最终数值在0x80、0x40、0x20……这些数的时候可以用(规律自己找)。不是任何数据都可以这样写的。

使用特权

评论回复
10
lr_xgm| | 2016-5-30 10:40 | 只看该作者
条条大路通罗马,至于怎么写,就看自己对代码运行效率的控制

使用特权

评论回复
11
coody| | 2016-5-30 11:32 | 只看该作者
楼主的程序;
Temp++;
if(Temp==0x08)Temp=0;

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

沙发说的对,就是用最低的3位计数

使用特权

评论回复
12
mcu5i51| | 2016-5-30 14:25 | 只看该作者
linqing171 发表于 2016-5-30 09:50
一看就是FPGA人员想学下C语言。
没有分号,0b开头,已经深深的出卖了你。

仁兄好像这次错了,FPGA还没有好好学习一下;
之所以没有加上分号是因这本就不是一个完整的语句,
只是一步步分析如何做的

使用特权

评论回复
13
hzocce|  楼主 | 2016-6-8 08:52 | 只看该作者
那还是用   if(Temp>=0x08)Temp=0   ?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

561

帖子

4

粉丝