無符號整數使用位運算實現除以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等價形式,那么:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM