无符号整数使用位运算实现除以10运算
目的是不用除法,使用位运算实现除以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等价形式,那么: