首页
社区
课程
招聘
怎么右移等于除10
发表于: 2014-5-19 23:34 6295

怎么右移等于除10

2014-5-19 23:34
6295
char* __cdecl NtIntToString(int _Val,char* _Str)        //%d格式化
{       
        //int _Left = 0;
        int _Right = 0;
        int nLen = NtStrLen(_Str);

        if(_Val < 0)
        {
                //_Val = abs(_Val);
                __asm neg _Val                                //取反
                _Str[nLen] = '-';
                nLen++;
        }
        int nCount = 0;
        do
        {
                _Right = _Val % 10;
                _Str[nCount+nLen] = PsIntToChar(_Right,true);
                nCount++;
                _Val = _Val / 10;
        }while(_Val);
        _Str[nCount+nLen] = 0;
        int nIndex = nCount / 2;
        char cBuff = 0;
        for(int i=0;i<nIndex;i++)
        {
                cBuff = _Str[i+nLen];
                 _Str[i+nLen] =  _Str[(nCount-i-1)+nLen];
                 _Str[(nCount-i-1)+nLen] = cBuff;
        }
        return _Str;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
不能,右移一次等于除以2,右移N次等于2的N次幂。
2014-5-20 00:02
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
对于十进制才是除10,当然一般的右移操作都是二进制的.
2014-5-20 00:19
0
雪    币: 159
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
我直说一个字,操作符重载
2014-5-20 09:04
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
二进制右移是除2....但是不排除楼上说的操作符重载(虽然我没用过)
2014-5-20 09:28
0
雪    币: 30
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
汇编和C中的左移/右移本质上是对操作数进行2的n次幂的乘法/除法操作,注意10不是2的n次幂。
2014-5-20 09:36
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
A <3  +  A<1
2014-5-20 17:17
0
雪    币: 807
活跃值: (2293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
右移操作是要丢失信息的,移几位就会丢几位,所以,右移操作作为除法使用的前提是,被除数将要被移出的低位必须全部为0,否则将有信息损失。
2014-5-20 17:41
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可以通过右移和乘法得到除10的整数结果,不过需要magic num的帮助(几乎所有的编译器都会尝试将除法优化成乘法和移位操作)。-->Magic Number计算器

假设ECX是你要的除数,则以下汇编代码向寄存器EAX返回ECX/10的整数结果:

MOV EDX, 0x66666667
MOV EAX,ECX
IMUL EDX
MOV EAX,ECX
SAR EAX, 0x1f
SAR EDX,2
SUB EDX,EAX
MOV EAX,EDX

补充一下,翻译成C就是:

EAX = ECX / 10;

另有前辈文章:《浅析VC++6.0对整数除以常量的处理》
2014-5-20 19:39
0
雪    币: 219
活跃值: (788)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
10
8         4       2     1
2^3 2^2   2^1  2^0
也就是左X右÷;
至于为什么你转化一下进制就知道了
2014-5-20 19:46
0
雪    币: 121
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我不怎么懂,楼主写什么我都不懂。
右移我是这样理解的。
比如   1010000.
右移 一位就是小数点不动,左边的数字向右移了一位 等于 101000.

比如   10111100.
左移 一位就是小数点不动,左边的数字向左移了一位 等于  101111000.

如果是二进制 右移一位差不多就是除2
如果是十进制 右移一位差不多就是除10
2014-8-21 21:03
0
游客
登录 | 注册 方可回帖
返回
//