青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fly me to the moon

the beauty of C++

位運算之美——用+,-和位運算實現正整數除法和取模(二)

作者:翼帆@cppblog 
原文地址:http://m.shnenglu.com/xiaoyisnail/archive/2009/09/21/96883.html
本文版權歸作者和cppblog共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

終于有時間寫本文的第二部分了。在
上一篇文章(下文中稱為“文(一)”)中,我提出了一個具體的問題“只能用+,-和位運算實現整數除法(/)和取模(%)”,并整理了一些和位運算相關的題目和算法,本文將給出上述問題的一個完整的解答思路和實現。

首先思考最簡單的除法實現,即循環(huán)減除數,減到不能再減為止,所減次數即所求的商,事實上這就是我們初學四則運算時對除法的定義,實現:

 1int integer_div_0(int dividend, int divisor)
 2{
 3    if(divisor == 0)
 4    {
 5        cout<<"非法參數,除零錯"<<endl;
 6        exit(1);
 7    }

 8
 9    int res = 0;
10    while((dividend-=divisor)>=0)
11        ++res;
12
13    return res;
14}

很顯然,這個簡單的實現是非常低效的,求integer_div_0(a,b)的時間復雜度為O(a/b),當a很大b很小時,計算開銷很大,有什么辦法能提高效率嗎?考慮到循環(huán)減除數同時比較差是否大于等于0有點類似于在一個一個數組或是linked list中順序搜索某個目標值,在較差的情況下近似于搜索整個問題空間,這樣的開銷必然很大,那么只要找到某個方法來減少需要搜索的問題空間就可以提高性能了。于是,自然可以想到如下算法:以除數為初始測試值,以2的指數為步長來搜索問題空間,當被除數與測試值的差小于除數時便結束搜索,若在這之前測試值大于被除數,則將被除數減去前一個測試值,并重復上述過程直到搜索結束。舉個例子,求1200/3:
順序搜索時,我們要與1200比較的數有:3,6,9,12,15,...,1998,2001,比較次數667次
以2的指數為步長搜索時,與1200比較3,6,12,24,48,96,192,384,768,1536,然后與1200-768=432再進行比較3,6,12,24,48,96,192,384,768,再取432-384=48比較3,6,12,24,48,搜索結束,比較次數共24次,比順序搜索有很大的提高。你可能會問,為什么要以2的指數為步長來搜索呢?答案是,這樣我們就可以使用位操作來進一步提高計算效率了。下面是這個算法的實現:
 1int integer_div_1(unsigned int dividend, unsigned int divisor)
 2{
 3    if(divisor == 0)
 4    {
 5        cout<<"非法參數,除零錯"<<endl;
 6        exit(1);
 7    }

 8
 9    if(dividend < divisor) return 0;
10    unsigned int k=0,c=divisor, res=0;
11    
12    for(;dividend>=c;c<<=1,k++)
13        if(dividend-< divisor)
14            return 1<<k;
15
16    return integer_div_1(dividend-(c>>1), divisor)+(1<<(k-1));
17}
注意到最后一行的尾遞歸,再把代碼優(yōu)化為非遞歸如下:
 1//非遞歸整數除法
 2int integer_div_2(unsigned int dividend, unsigned int divisor)
 3{
 4    if(divisor == 0)
 5    {
 6        cout<<"非法參數,除零錯"<<endl;
 7        exit(1);
 8    }

 9
10    if(dividend < divisor) return 0;
11    unsigned int k, c, res=0;
12
13    while(dividend > divisor)
14    {
15        for(k=0,c=divisor;dividend>=c;c<<=1,k++)
16        {
17            if(dividend-< divisor)
18            {
19                res += 1<<k;
20                break;
21            }
        
22        }

23        if(dividend-< divisor)
24            break;
25
26        res += 1<<(k-1);
27        dividend -= c>>1;
28    }

29
30    return res;
31}
最后,有了整數除法,取模運算就很簡單了,從進行整數除法搜索商的最后一步立刻就能得到模除的余數,實現如下,為了方便起見,代碼里使用C++ STL中的pair模板以同時返回商和余數:
 1//整數除法and取模,返回商和余數
 2pair<int,int> integer_div_3(unsigned int dividend, unsigned int divisor)
 3{
 4    if(divisor == 0)
 5    {
 6        cout<<"非法參數,除零錯"<<endl;
 7        exit(1);
 8    }

 9
10    if(dividend < divisor) 
11        return make_pair(0, dividend);
12    unsigned int k, c, quotient=0, remainder;
13
14    while(dividend > divisor)
15    {
16        for(k=0,c=divisor;dividend>=c;c<<=1,k++)
17        {
18            if(dividend-< divisor)
19            {
20                quotient += 1<<k;
21                remainder = dividend-c;
22                break;
23            }
        
24        }

25        if(dividend-< divisor)
26            break;
27
28        quotient += 1<<(k-1);
29        dividend -= c>>1;
30    }

31
32    return make_pair(quotient, remainder);
33}

寫到這里,算是把全文的任務都完成了,讀者可能覺得文(一)和文(二)里講到的一些題目的關系不大,但我寫這兩篇文章的目的就是想強調位運算的作用,或者說二進制的美,很多時候如果我們換個角度,用二進制來思考問題,也許會突然“Aha!Insight!”,從而得到一個優(yōu)美的解答。


附上代碼:http://m.shnenglu.com/Files/xiaoyisnail/bits.rar

posted on 2009-09-21 22:12 翼帆 閱讀(8339) 評論(2)  編輯 收藏 引用 所屬分類: 算法

評論

# re: 位運算之美——用+,-和位運算實現正整數除法和取模(二) 2011-09-25 12:47 skyworm

int integer_div_2(unsigned int dividend, unsigned int divisor)
{
if(divisor == 0)
{
cout<<"非法參數,除零錯"<<endl;
exit(1);
}

if(dividend < divisor) return 0;
unsigned int k, c, res=0;

while(dividend > divisor)
{
for(k=0,c=divisor;dividend>=c;c<<=1,k++)
{
;
}

res += 1<<(k-1);
dividend -= c>>1;
}

return res;
}
  回復  更多評論   

# re: 位運算之美——用+,-和位運算實現正整數除法和取模(二) 2012-11-05 16:21 skybirdhero@gmail.com

這篇文章寫的十分出色,謝謝cppblog的分享!  回復  更多評論   

導航

<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美欧美| 欧美影片第一页| 国产精品福利久久久| 欧美大尺度在线| 欧美日韩国产一中文字不卡| 久久精品在线播放| 久热爱精品视频线路一| 男男成人高潮片免费网站| 久热综合在线亚洲精品| 欧美伦理影院| 国产精品久久久久久五月尺| 欧美日韩综合另类| 国产日韩视频一区二区三区| 国产欧美日本| 亚洲图片在区色| 麻豆精品视频| 亚洲无亚洲人成网站77777| 久久精品主播| 欧美午夜美女看片| 亚洲国产成人av| 午夜在线不卡| 99国产精品一区| 在线一区欧美| 性欧美8khd高清极品| 欧美成人免费视频| 国产精品综合不卡av| 亚洲人成亚洲人成在线观看图片 | 亚洲免费视频在线观看| 久久久水蜜桃| 欧美一级二级三级蜜桃| 欧美性理论片在线观看片免费| 国内揄拍国内精品久久| 久久国产精品网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久亚洲精品一区二区| 国内久久精品| 久久躁狠狠躁夜夜爽| 欧美中在线观看| 亚洲成色www久久网站| 久热综合在线亚洲精品| 久久人人97超碰精品888 | 香蕉乱码成人久久天堂爱免费| 欧美日韩一区二区免费视频| 99综合在线| 亚洲综合社区| 在线欧美日韩国产| 亚洲精品久久久久久一区二区| 久久青草欧美一区二区三区| 亚洲最新合集| 久久精品国产成人| 一本色道久久综合亚洲精品不| 在线中文字幕一区| 激情欧美一区二区三区| 亚洲精品影院在线观看| 欧美精品v国产精品v日韩精品| 亚洲伊人网站| 玖玖视频精品| 久久全国免费视频| 国产精品ⅴa在线观看h| 久久亚洲国产精品日日av夜夜| 麻豆精品视频在线观看视频| 亚洲字幕在线观看| 欧美精品久久久久久久免费观看 | 亚洲精品久久嫩草网站秘色| 欧美婷婷六月丁香综合色| 免费成人av资源网| 国产欧美日韩视频一区二区| 亚洲欧洲三级电影| 一区免费观看| 欧美在线1区| 欧美一区二区三区在线观看| 欧美精品在线免费| 91久久国产精品91久久性色| 精品成人久久| 久久久亚洲欧洲日产国码αv | 在线看无码的免费网站| 久久福利精品| 嫩模写真一区二区三区三州| 国产亚洲制服色| 久久精品三级| 亚洲第一黄网| 亚洲视频一起| 国产视频亚洲| 欧美gay视频| 夜夜爽99久久国产综合精品女不卡| 99精品视频免费在线观看| 鲁大师成人一区二区三区| 欧美国产日本在线| 99这里只有精品| 国产一级一区二区| 欧美激情 亚洲a∨综合| 亚洲精品久久久蜜桃| 欧美中文字幕不卡| 亚洲精品久久久久久下一站| 国产精品久久久久久久浪潮网站 | 欧美午夜精品久久久久久孕妇| 一本久道久久综合婷婷鲸鱼| 欧美一级欧美一级在线播放| 国产在线精品二区| 国产精品高潮呻吟久久| 免费成人黄色片| 亚洲欧美中文在线视频| 亚洲国产另类久久精品| 噜噜噜躁狠狠躁狠狠精品视频| 一区二区av| 亚洲日本一区二区| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品国产三级国产普通话99 | 久久激情视频久久| 亚洲制服av| 欧美影院视频| 久久福利毛片| 久久综合一区| 欧美精品一区二区三区一线天视频| 久久高清一区| 久久国产精彩视频| 久久久亚洲综合| 欧美a级片网| 国产精品国产自产拍高清av| 国产精品夜夜夜一区二区三区尤| 欧美v国产在线一区二区三区| 免费黄网站欧美| 欧美日韩在线精品| 国产精品外国| 亚洲精品国产无天堂网2021| 亚洲理伦在线| 午夜国产精品视频| 久久一区二区三区av| 亚洲第一视频网站| 一本久久综合亚洲鲁鲁五月天| 亚洲免费在线精品一区| 老牛国产精品一区的观看方式| 欧美激情2020午夜免费观看| 欧美特黄一级| 亚洲精品国产精品国自产观看| 一区二区三区欧美在线| 久久精品夜色噜噜亚洲a∨ | 国产亚洲精品bv在线观看| 一区二区在线观看视频| 亚洲精品乱码久久久久久久久| 日韩亚洲精品电影| 欧美在线观看视频一区二区| 欧美国产一区二区三区激情无套| 亚洲三级免费观看| 久久国产免费看| 欧美日韩伦理在线| 激情亚洲网站| 性欧美videos另类喷潮| 亚洲国产美女精品久久久久∴| 亚洲一区在线观看视频| 久久精品女人天堂| 亚洲成在人线av| 亚洲高清二区| 欧美精品在线观看| 中日韩视频在线观看| 99re在线精品| 国产精品久久久久久久午夜 | 欧美ed2k| 久久久久久国产精品mv| 国内精品久久久久影院薰衣草| 午夜精品理论片| 久久精品二区| 亚洲美女淫视频| 这里只有精品丝袜| 国产综合色在线| 91久久国产综合久久| 国产精品久久午夜| 老司机精品视频一区二区三区| 久久精品首页| 亚洲欧美日韩一区二区在线| 亚洲欧美国产另类| 亚洲黄色在线看| 一区二区三区欧美在线观看| 国产精品入口夜色视频大尺度| 欧美影片第一页| 欧美日本精品| 久久精品天堂| 欧美日韩国产三级| 久久频这里精品99香蕉| 在线天堂一区av电影| 一区二区三区四区五区视频| 91久久视频| 国产精品影视天天线| 久久免费午夜影院| 欧美精品18+| 久久天天躁狠狠躁夜夜爽蜜月| 欧美成人蜜桃| 亚洲日本理论电影| 亚洲欧美日韩国产综合| 一区二区三区免费在线观看| 欧美在线free| 欧美在线免费观看| 国产精品一区在线观看| 亚洲精品无人区| 亚洲国产精品电影| 午夜影院日韩| 久久se精品一区二区| 国产精品男gay被猛男狂揉视频| 亚洲激情偷拍| 在线一区免费观看|