C-在c语言中乘法和除法,比位移运算更快吗?
比如下面一个例子
i*2 = i<<1
i*3 = (i<<1)+i;
i*10 = (i<<3) + (i<<1)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
比如下面一个例子
i*2 = i<<1
i*3 = (i<<1)+i;
i*10 = (i<<3) + (i<<1)
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
应该不管是哪种语言,都有“移位>乘法>除法”的特性。
而且移位还会用在其他运算中,举个例子:
为了避免使用Math类的round方法进行四舍五入,可以用替代方法:
function round(value:Number):int {
return (value + 0.5) >> 0;
}
我现在就在做一个测试 用的是AVR 单片机 8 bits的
用了除法运算 明显的就看到程序的运行速度变慢了许多
因为该类型的芯片没有硬件除法,是通过算法模拟的
速度:移位>乘法>除法。
计算机中有专门的移位功能部件,这也是最基础的部件。乘法和除法都是靠移位实现的。乘2^n,左移n位,除2^n,右移n位。
另外,原始的乘法器是一步一步乘(移位)出来的,每次取乘数的一位与被乘数操作,1则把被乘数照写,0则为0,然后乘数右移。这样循环,最后把每一步结果加起来。
后面通过阵列连乘器改进速度,一次算出上面每一步的结果,然后直接相加。
乘法是加操作,而除法是每步的结果作加法或减法(加减交替法),有的算法还需要恢复上一次的结果(余数恢复法),而且每一步加减后还要进行移位,所以最慢。
具体参见<<计算机组成原理>>。
因为移位速度快,所以经常被应用。比如给程序加花指令(增加Cracker破解难度)时,很多地方使用移位操作。
对于这个问题,就像上面众高手所说,应该归结于计算机硬件而不是某种语言。
上面也给出了非常标准的答案,不过我还想给出一个趣味一些的答案:也许在不久的将来,一些新型计算机的出现,如量子计算机,能实现乘法跟除法比移位更快的运行速度,据说量子计算机对一个1000位的数进行因式分解只需几分之一秒,同样的事情由目前最快的计算机来做,则需10年。
移位、乘法、除法要根据MCU的架构和编译器的编译方式,在绝大多数情况下,移位效率肯定是大于乘法、除法是很慢的,即使MCU带有除法器,所使用的周期也比乘法多,在有的mcu上具有单周期乘法器,这种就比较快。
位移运算肯定是最快的...也是通过位移运算实现的嘛.. + - * /的效率和难度问题,你可以去找找c/C++中 大数的+-/的模板就知道难易和效率问题.
移位比乘法快,个别情况下编译器会将高级语言的乘法编译成移位指令,但大部分还是直接用乘法指令。一个乘法指令的周期是移位或者加法指令的6倍左右,你说哪个快。
所有的数学计算都是通过逻辑移位或者算术移位来实现的。其中除法是最慢的