欢迎光临散文网 会员登陆 & 注册

无符号整型除法的快速算法

2020-05-31 18:13 作者:九条可怜酱  | 我要投稿

众所周知,即使是现在最新的CPU整数除法指令依然是相当慢的,在某些情况下耗时和几十次位运算差不多。而整数乘法指令则相当快,耗时和两三次位运算相当。

各种主流编译器很早就明白了这个道理,它们会对除数为常量的整数除法进行优化,优化成整数乘法和移位运算。

下面我们来看一些编译器优化的例子。

GCC -O2
C# JIT ASM

可以看到编译器把x/5优化成了(unsigned int)((x*3435973837ULL)>>34)。那么问题来了,编译器都干了些什么,乘以3435973837和右移34是怎么算出来的?


下面我只说这2个数怎么算出来的,具体数学原理可以在文章末尾的链接参考某大佬的文章。

在32位无符号整型范围内,将x/y变成(x*a)>>b等价形式,那么:

当然,这么直接有缺点的,超出32位范围了,如何继续优化参考大佬文章吧!



参考:http://ridiculousfish.com/blog/posts/labor-of-division-episode-i.html


无符号整型除法的快速算法的评论 (共 条)

分享到微博请遵守国家法律