看看编译器是怎样用乘法代替除法的
来源:互联网 发布:stm32定时器计算软件 编辑:程序博客网 时间:2024/04/27 19:31
在0与1的计算机世界中,最复杂的运算就是除法了。复杂到什么程度呢?就是不到万不得已的情况下,连编译器自己都不愿意产生除法指令。
备注:以下分析,主要针对的情况为 除数不是2的指数。如果除法是2的指数,尽可以简单地使用移位来运算。比如, 20 / 4 = 20 >> 2 = 5(2 ^ '2' = 4)。
1.例程代码
简单的C程序:
在Linux下通过 gcc -S div5.c 产生的汇编代码div5.s:2.代码分析
通过代码分析,这里将除法转换为乘法的方法就是
x = y / divider = (y * M) >> 33; 其中M = ((1 << 33) + 3) / divider,当divider=5, M=1717986919=0x66666667。
推导证明过程,我没有深入研究,在此也不作赘述。
汇编代码部分,我就乘法指令“IMUL source”,作简单说明。
source为乘数,在使用IMUL指令之前,需将被乘数置于EAX寄存器中,如果结果为64位值(如两个4字节数之间的乘法),最终的结果放置在EDX:EAX寄存器对中,高32位值在EDX中,低32位值在EAX中。将(y * divider)的结果右移33位,其实就是将EDX右移1位。
0 0
- 看看编译器是怎样用乘法代替除法的
- VC 编译器将除法优化为乘法的策略
- 看看老外是怎么做乘法的!
- 看看老外是怎么做乘法的!
- 用位运算来代替乘法、除法和取余的方式
- 用位运算来代替乘法、除法以及取模
- js的安全乘法、除法
- 多项式的乘法和除法
- 乘法和除法的汇编形式
- java中的除法和乘法的若干问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- javascript(js)的小数点乘法除法问题
- 将除法转换为乘法的MagicNumber
- HttpServletRequestWrapper的用法
- Snail—OC学习之类及对象
- 哈希表系列:初探哈希(二),c语言实现
- 多校#2 B
- 第5章面试2--专家打分
- 看看编译器是怎样用乘法代替除法的
- Python操作Mysql实例代码教程
- hdu 5289 Assignment
- dfs算法经典例题
- Android 安卓点击运行后 出错
- 最全面的linux信号量解析
- css前端笔试面试题
- BZOJ 2298 [HAOI2011]problem a DP
- OC 关联对象(Associated Object)