c中的位移与乘法的速度

首先下面是c中的位移指令:

shl   -逻辑左移指令
shr   -逻辑右移指令

 

移位快,不过只能是乘2的次方数   > >   1   ==   *2           > >   2   ==   *4         > >   3   ==   *8   ....

 

 

不过即使我们使用乘法,一般编译器会自动优化

比如

        int   a   =   1;
0041138E     mov                   dword   ptr   [a],1  
        int   b   =   a   *   4;
00411395     mov                   eax,dword   ptr   [a]  
00411398     shl                     eax,2                                         //   编译器优化了
0041139B     mov                   dword   ptr   [b],eax

 

 

如果编译器没有进行优化,那么乘法一般时用移位+加法来完成的,例如P   =   A   *   B,可以这样做:
P   =   0;
for   the   i 's   bit   of   B
        if   (bi)   P   +=   A   < <   i
有理数、实数等等也是类似的做法,只不过是用小数的二进制表示法代替整数的。

对于内建类型,直接调用一条汇编指令,如果硬件直接支持的情况下,复杂数据的乘法会比自己写移位算法更快(硬件乘法做一次有比较独立的时长,如十几个时钟周期,因为数据是一次读入,并且在硬件内部实现的;这样就会比代码写成的多次指令、多次读写要快。而现在的硬件基本都是直接支持的。)当然,只做一、二次移位的*2,*3等等肯定还是移位的方案快。此外,对于非内建类型(如大数乘法),还是移位+加法要快,因为此时即使用乘法,也要调用很多次,就远远比不上移位了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值