目的是不用除法,使用位運算實現除以10運算。
我自己一開始是這樣探究的:
x/10=x/16+x/32+(x/16)/10
假設f(x)=x/10,那么就有f(x)=(x>>4)+(x>>5)+f(x>>4),但是實際操作的時候,這個遞推式不好用,因為無符號數小的時候,右移直接歸零了。
這個博客好NB
unsigned int div10(unsigned short x) { unsigned q,r; q=(x>>1)+(x>>2); q=q+(q>>4); q=q+(q>>8); q=q+(q>>16); q=q>>3; r=x-(((q<<2)+q)<<1); return q+(r>9); }
這個代碼是能運行的!
而且看起來和我的思路有點像。。。
在編譯層面的優化上,會傾向使用魔數來優化編譯,用乘法和右移運算快速實現除法。
無符號整型除法的快速算法 - 嗶哩嗶哩 (bilibili.com)
可以看到編譯器把x/5優化成了(unsigned int)((x*3435973837ULL)>>34)。
在32位無符號整型范圍內,將x/y變成(x*a)>>b等價形式,那么: