打印

求看过由小草发的帖子的人进来解释下..

[复制链接]
1910|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jack602|  楼主 | 2010-11-26 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Jack602 于 2010-11-26 08:51 编辑

问题是这样的:

一个16位的数据(范围是0~65536),因为只支持1字节的加减乘除,所以有点难分离出2字节的个十百千万位来。

tempA    变量保存16位的高8位
tempB    变量保存16位的低8位

怎么求得?
temp1    变量保存16位数据的个位
temp2    变量保存16位数据的十位
temp3    变量保存16位数据的百位
temp4    变量保存16位数据的千位
temp5    变量保存16位数据的万位

为什么如下的程序就不可以
void        Adjust(uint val)
{
        while(val>=10000)
        {
                val -= 10000;
                temp1++;
        }
        
        while(val>=1000)
        {
                val -= 1000;
                temp2++;
        }
        
        while(val>=100)
        {
                val -= 100;
                temp3++;
        }
        
        while(val>=10)
        {
                val -= 10;
                temp4++;
        }
        
        temp5 = val;
}
理由是不能16位的数据操作?

-------------------------------------------
但如下的程序就可以?
if( Var2 >= 60000 ){ i = 6; Var2 -= 60000; }
                                                        if( Var2 >= 40000 ){ i = 4; Var2 -= 40000; }在这里不也超出了1字节运算吗?  所以请高手在解释解释  谢谢
                                                        if( Var2 >= 20000 ){ i = 2; Var2 -= 20000; }
                                                        if( Var2 >= 10000 ){ i += 1; Var2 -= 60000; }
                                                        DispBuf[4] = i;
                                                        if( Var2 >= 8000 ){ i = 8; Var2 -= 8000; }
                                                        if( Var2 >= 4000 ){ i = 4; Var2 -= 4000; }
                                                        if( Var2 >= 2000 ){ i += 2; Var2 -= 2000; }
                                                        if( Var2 >= 1000 ){ i += 1; Var2 -= 1000; }
                                                        DispBuf[3] = i;
                                                        if( Var2 >= 800 ){ i = 8; Var2 -= 800; }
                                                        if( Var2 >= 400 ){ i = 4; Var2 -= 400; }
                                                        if( Var2 >= 200 ){ i += 2; Var2 -= 200; }
                                                        Var1 = Var2;
                                                        if( Var1 >= 100 ){i += 1;Var1 -= 100; }
                                                        DispBuf[2] = i;
                                                        i = 0;
                                                        if( Var1 >= 80 ){i = 8;  Var1 -= 80; }
                                                        if( Var1 >= 40 ){i = 4; Var1 -= 40; }
                                                        if( Var1 >= 20 ){i += 2; Var1 -= 20; }
                                                        if( Var1 >= 10 ){i += 1; Var1 -= 10; }
                                                        DispBuf[1] = i;
                                                        //最后一位为个位
                                                        DispBuf[0] = Var1;

相关帖子

沙发
Jack602|  楼主 | 2010-11-26 09:10 | 只看该作者
在线等..

使用特权

评论回复
板凳
wangyy608| | 2010-11-26 09:25 | 只看该作者
temp1    变量保存16位数据的个位
temp2    变量保存16位数据的十位
temp3    变量保存16位数据的百位
temp4    变量保存16位数据的千位
temp5    变量保存16位数据的万位

调void        Adjust(uint val)  temp1~5没清零?

使用特权

评论回复
地板
Jack602|  楼主 | 2010-11-26 09:31 | 只看该作者
temp1    变量保存16位数据的个位
temp2    变量保存16位数据的十位
temp3    变量保存16位数据的百位
temp4    变量保存16位数据的千位
temp5    变量保存16位数据的万位

调void        Adjust(uint val)  temp1~5 ...
wangyy608 发表于 2010-11-26 09:25


应该清零的,我现在想知道的是为什么第二个程序就不算是16位数据操作..不是和第一个程序一样吗? 继续苦等..

使用特权

评论回复
5
老鱼探戈| | 2010-11-26 11:44 | 只看该作者
第二个也写的太繁琐了点吧

使用特权

评论回复
6
Jack602|  楼主 | 2010-11-26 12:35 | 只看该作者
继续等,等是痛苦的...

使用特权

评论回复
7
ejack| | 2010-11-26 12:42 | 只看该作者
第一种方法没什么不可以。如果LZ说不可以,贴图为证。

第二种方法用代码量换速度。其中有一处恐怖的书写错误,如果LZ说“可以”,那我就去跳死海……

使用特权

评论回复
8
Jack602|  楼主 | 2010-11-26 13:19 | 只看该作者
第一种方法没什么不可以。如果LZ说不可以,贴图为证。

第二种方法用代码量换速度。其中有一处恐怖的书写错误,如果LZ说“可以”,那我就去跳死海…… ...
ejack 发表于 2010-11-26 12:42


我知道,第二种,每跳出一个阶级 i=0  并且60000要改成10000对吧,

第一种确实可以吗? 这位兄弟?

使用特权

评论回复
9
areshan| | 2010-11-26 20:17 | 只看该作者
两种都可以支持1字节,1字节和2字节没有发现有什么不同,第一种方法每次减的数一个进位(10,100,1000,10000),而第二种每次减的数要多,貌似比第一种快,其实也快不了多少。如果是80000,第一方法要分离出万位要循环8次,加后面3次判断。
第二种方法,执行2次IF,加后面12次判断。

不知道说的对不对!

使用特权

评论回复
10
mohanwei| | 2010-11-26 20:24 | 只看该作者
用C不用考虑这么多吧。编译器检测到硬件支持就用硬件给你算,不支持就用数学库函数给你算……

使用特权

评论回复
11
Jack602|  楼主 | 2010-11-26 21:23 | 只看该作者
两种都可以支持1字节,1字节和2字节没有发现有什么不同,第一种方法每次减的数一个进位(10,100,1000,10000),而第二种每次减的数要多,貌似比第一种快,其实也快不了多少。如果是80000,第一方法要分离出万位要 ...
areshan 发表于 2010-11-26 20:17


呵呵..应该没有80000吧? 最大也就65536..

使用特权

评论回复
12
tianm| | 2010-11-27 02:25 | 只看该作者
小草是谁

使用特权

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

本版积分规则

0

主题

209

帖子

2

粉丝