打印

求一个分离(个、十、百、千、万)位的好算法

[复制链接]
19410|84
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一棵小草|  楼主 | 2010-6-9 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是这样的:

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

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

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

相关帖子

来自 2楼
梅开二度| | 2010-6-9 22:01 | 只看该作者
if( Var2 >= 60000 ){ i = 6; Var2 -= 60000; }
                                                        if( Var2 >= 40000 ){ i = 4; Var2 -= 40000; }
                                                        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;

使用特权

评论回复
板凳
ayb_ice| | 2010-6-9 14:25 | 只看该作者
除法都不会吗

使用特权

评论回复
地板
lsh505| | 2010-6-9 16:42 | 只看该作者
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;
}

使用特权

评论回复
5
一棵小草|  楼主 | 2010-6-9 19:42 | 只看该作者
本帖最后由 一棵小草 于 2010-6-9 19:44 编辑
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)
        { ...
lsh505 发表于 2010-6-9 16:42

uint val???
不是说了吗?不能16位的数据操作啊。。。
不过我知道你的思路了,呵呵
是我转不过弯来,乘以256再减就行了。

使用特权

评论回复
6
一棵小草|  楼主 | 2010-6-9 19:46 | 只看该作者
除法都不会吗
ayb_ice 发表于 2010-6-9 14:25


不能16位数据的操作,除法不行的,3楼的方法再改进一下才行得通。

使用特权

评论回复
7
xwj| | 2010-6-9 19:53 | 只看该作者
唉~

使用特权

评论回复
8
梅开二度| | 2010-6-9 22:01 | 只看该作者
这个比除法求余速度快。

使用特权

评论回复
9
ciniao| | 2010-6-10 09:28 | 只看该作者
2# ayb_ice 我发现你 aby_ice 同学很水,即使是个前辈,对求知者,态度不应该这样NB哄哄,又不能立刻给出解决方法!

使用特权

评论回复
10
蓝阳鼎点人| | 2010-6-10 10:00 | 只看该作者
7楼的不错。

使用特权

评论回复
11
一棵小草|  楼主 | 2010-6-10 13:30 | 只看该作者
if( Var2 >= 60000 ){ i = 6; Var2 -= 60000; }
                                                        if( Var2 >= 40000 ){ i = 4; Var2 -= 40000; }
                                                        if( Var2 >= 20000 ){ i = 2; Var2 -= 20000; }
                                                        if( Var2 >= 10000 ){ i += 1; Var2 -= 60000;  ...
梅开二度 发表于 2010-6-9 22:01


谢谢,这个算法效率很不错,我仔细推敲推敲去

使用特权

评论回复
12
tangzzbb| | 2010-6-10 13:33 | 只看该作者
uchar tempA;                        //    变量保存16位的高8位
uchar        tempB;                        //    变量保存16位的低8位

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

void calculate(void)
{
  temp1=0;
  temp2=0;
  temp3=0;
  temp4=0;
  temp5=0;
  
  //10000=0x2710
  while(((tempA==0x27)&&(tempB>=0x10))||(tempA>0x27))                //>=10000?
        {
    if(tempB>=0x10)                        //-10000
    {
      tempB-=0x10;
      tempA-=0x27;       
    }
    else
    {
            tempB+=(~0x10)+1;
            tempA-=0x27+1;
    }
          temp5++;
        }
       
        //1000=0x03e8
        while(((tempA==0x03)&&(tempB>=0xe8))||(tempA>0x03))                //>=1000?
        {
    if(tempB>=0xe8)                        //-1000
    {
      tempB-=0xe8;
      tempA-=0x03;       
    }
    else
    {
            tempB+=(~0xe8)+1;
            tempA-=0x03+1;
    }
          temp4++;
        }
       
        //100=0x0064
        while(((tempA==0)&&(tempB>=0x64))||(tempA>0))                //>=100?
        {
    if(tempB>=0x64)                        //-100
    {
      tempB-=0x64;
    }
    else
    {
            tempB+=(~0x64)+1;
            tempA-=1;
    }
          temp3++;
        }
       
        //10=0x0a
        while(tempB>=0x0a)                //>=10?
        {
      tempB-=0x0a;
      temp2++;
        }
       
        //1=0x01
        while(tempB>=0x01)                //>=1?
        {
      tempB-=0x01;
            temp1++;
        }

       
}

使用特权

评论回复
13
zhiyonghe| | 2010-6-10 21:38 | 只看该作者
good

使用特权

评论回复
14
cooklxq| | 2010-6-11 11:59 | 只看该作者
是要c的吗???

使用特权

评论回复
15
一棵小草|  楼主 | 2010-6-11 13:08 | 只看该作者
算法不涉及C还是汇编,只要我知道你的算法流程,我就能写出C或者汇编。

使用特权

评论回复
16
wxw2000| | 2010-6-11 13:20 | 只看该作者
7楼的思路不错

使用特权

评论回复
17
aresc| | 2010-6-11 13:25 | 只看该作者
有个错误65536不是16位的。

使用特权

评论回复
18
zj612| | 2010-6-11 16:06 | 只看该作者
if( Var2 >= 60000 ){ i = 6; Var2 -= 60000; }
                                                        if( Var2 >= 40000 ){ i = 4; Var2 -= 40000; }
                                                        if( Var2 >= 20000 ){ i = 2; Var2 -= 20000; }
                                                        if( Var2 >= 10000 ){ i += 1; Var2 -= 60000; } 这里的60000应该是10000吧?!

使用特权

评论回复
19
inter_zhou| | 2010-6-11 17:02 | 只看该作者
不知道那个"酷"为什么是加到7楼,而不是12楼。
反汇编出来尺寸差异应该是很大的。12楼的不错

使用特权

评论回复
20
zhiyonghe| | 2010-6-11 17:14 | 只看该作者
if( Var2 >= 60000 ){ i = 6; Var2 -= 60000; }
                                                        if( Var2 >= 40000 ){ i = 4; Var2 -= 40000; }
                                                       ...
zj612 发表于 2010-6-11 16:06


不是吧?我看没错呀!!

看来看去还是觉得7楼的思路最酷!!MARK!!

使用特权

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

本版积分规则

0

主题

291

帖子

1

粉丝