无符号整数使用位运算实现除以10运算

  目的是不用除法,使用位运算实现除以10运算。

  

  我自己一开始是这样探究的:

  x/10=x/16+x/32+(x/16)/10

  假设f(x)=x/10,那么就有f(x)=(x>>4)+(x>>5)+f(x>>4),但是实际操作的时候,这个递推式不好用,因为无符号数小的时候,右移直接归零了。

 

  除10运算的快速算法 (360doc.com)

  这个博客好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等价形式,那么:

 

 

posted @ 2021-11-05 22:48  TheDa  阅读(1600)  评论(0编辑  收藏  举报