無符號(hào)整型除法的快速算法
眾所周知,即使是現(xiàn)在最新的CPU整數(shù)除法指令依然是相當(dāng)慢的,在某些情況下耗時(shí)和幾十次位運(yùn)算差不多。而整數(shù)乘法指令則相當(dāng)快,耗時(shí)和兩三次位運(yùn)算相當(dāng)。
各種主流編譯器很早就明白了這個(gè)道理,它們會(huì)對(duì)除數(shù)為常量的整數(shù)除法進(jìn)行優(yōu)化,優(yōu)化成整數(shù)乘法和移位運(yùn)算。
下面我們來看一些編譯器優(yōu)化的例子。





可以看到編譯器把x/5優(yōu)化成了(unsigned int)((x*3435973837ULL)>>34)。那么問題來了,編譯器都干了些什么,乘以3435973837和右移34是怎么算出來的?
下面我只說這2個(gè)數(shù)怎么算出來的,具體數(shù)學(xué)原理可以在文章末尾的鏈接參考某大佬的文章。
在32位無符號(hào)整型范圍內(nèi),將x/y變成(x*a)>>b等價(jià)形式,那么:

當(dāng)然,這么直接有缺點(diǎn)的,超出32位范圍了,如何繼續(xù)優(yōu)化參考大佬文章吧!
參考:http://ridiculousfish.com/blog/posts/labor-of-division-episode-i.html
標(biāo)簽: