• <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>

            單鏈DNA

            換了個(gè)地址:http://www.cnblogs.com/vizhen/

             

            計(jì)算二進(jìn)制中1的個(gè)數(shù)

            編寫一個(gè)函數(shù)返回?cái)?shù)字的二進(jìn)制位中‘1’的個(gè)數(shù)。

             

            方法一,遞歸

            int findOneinBin(int n)
            {
               if(n<2)
                  return 1;
              else return n%2+findOneinBin(n/2);
            }

            這個(gè)方法很容易想到,如果是奇數(shù)的話就是他的n/2+1,也就是有一位加上1個(gè)1.

            方法二,google一下找出來(lái)的,沒(méi)看懂

            #define POW(c) (1<<(c))
            #define MASK(c) (((unsigned long)-1) / (POW(POW(c)) + 1))
            #define ROUND(n, c) (((n) & MASK(c)) + ((n) >> POW(c) & MASK(c)))
            
            int bit_count(unsigned int n)
            {
                n = ROUND(n, 0);
                n = ROUND(n, 1);
                n = ROUND(n, 2);
                n = ROUND(n, 3);
                n = ROUND(n, 4);
                return n;
            }

            一下子看不明白,先把宏展開來(lái):
            POW是計(jì)算2的冪
            MASK很奇怪,一個(gè)全1的無(wú)符號(hào)數(shù)字除以2的冪的冪加1?
            好在打印出來(lái)還能看得懂:

            MASK(0) = 55555555 h = 01010101010101010101010101010101 b
            MASK(1) = 33333333 h = 00110011001100110011001100110011 b
            MASK(2) = 0f0f0f0f h = 00001111000011110000111100001111 b
            MASK(3) = 00ff00ff h = 00000000111111110000000011111111 b
            MASK(4) = 0000ffff h = 00000000000000001111111111111111 b

            這些mask分別把32位數(shù)字劃分為幾個(gè)部分。每個(gè)部分的前一半和后一半分別是全'0'和全'1'。
            MASK(0)分為16個(gè)部分,MASK(1)分為8個(gè)部分,...
            ROUND中對(duì)n的處理:(n & MASK) + (n >> POW & MASK)
            POW的值剛好是MASK中連續(xù)'0'(或者連續(xù)'1')的長(zhǎng)度。也就是說(shuō)ROUND把由MASK分開的n的各個(gè)部分中的高POW位和低POW位相加。
            為了便于說(shuō)明,取一個(gè)簡(jiǎn)單的部分:MASK(1)的0011
            假設(shè)n的值為1001,那么ROUND后的結(jié)果就是10 + 01 = 11 b,把這個(gè)結(jié)果賦值給n,這時(shí)n的含義由原來(lái)的二進(jìn)制位串變?yōu)?1'位的數(shù)量。特別的,當(dāng)ROUND(n, 0)時(shí),把n當(dāng)作一個(gè)32個(gè)部分各自'1'位的數(shù)量。('0'表示沒(méi)有'1',而'1'則表示有1個(gè)'1')
            計(jì)算完n = ROUND(n, 0)后,n是一個(gè)16個(gè)部分各自'1'位數(shù)量的'數(shù)組',這個(gè)'數(shù)組'的每個(gè)元素只有2個(gè)二進(jìn)制位。最大值為2,足夠由2個(gè)二進(jìn)制位來(lái)表示。
            接下來(lái),計(jì)算完n=ROUND(n,1)后,n是一個(gè)8個(gè)部分各自'1'位數(shù)量的'數(shù)組',這個(gè)'數(shù)組'的每個(gè)元素只有4個(gè)二進(jìn)制位。最大值為4,足夠由4個(gè)二進(jìn)制位來(lái)表示。(實(shí)際只需要3個(gè)二進(jìn)制位)
            ...
            最后一步,計(jì)算n=ROUND(n,4)后,n是一個(gè)1個(gè)部分各自'1'位數(shù)量的'數(shù)組',這個(gè)'數(shù)組'的每個(gè)元素有32個(gè)二進(jìn)制位。最大值為32,足夠由32個(gè)二進(jìn)制位來(lái)表示。(實(shí)際只需要6個(gè)二進(jìn)制位)
            這個(gè)代表32位內(nèi)'1'位數(shù)量的32位二進(jìn)制數(shù)也就是我們要求的結(jié)果。

            posted on 2011-02-24 16:12 Geek.tan 閱讀(846) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            公告

            coding是我的寂寞,我是誰(shuí)的寂寞

            隨筆分類(40)

            隨筆檔案(48)

            搜索

            積分與排名

            最新評(píng)論

            評(píng)論排行榜

            久久综合久久性久99毛片| 久久久久久久人妻无码中文字幕爆| 精品无码久久久久久尤物| avtt天堂网久久精品| 精品久久久久一区二区三区| 欧美精品丝袜久久久中文字幕 | 无码人妻精品一区二区三区久久 | 久久亚洲国产中v天仙www | 亚洲精品美女久久久久99| 久久久久人妻精品一区二区三区 | 无码乱码观看精品久久| 亚洲国产精品无码久久SM | 香蕉99久久国产综合精品宅男自| 久久久久久精品免费免费自慰| 久久久无码精品亚洲日韩按摩| 久久91精品综合国产首页| 五月丁香综合激情六月久久| 久久精品国产亚洲5555| 狼狼综合久久久久综合网| 久久人人爽人人爽人人片AV东京热 | 亚洲精品NV久久久久久久久久| 久久久久久久综合日本亚洲| 一本一本久久a久久综合精品蜜桃| 99久久精品国产一区二区三区| 国产91色综合久久免费| 久久狠狠爱亚洲综合影院| 久久久久国产亚洲AV麻豆| 日韩欧美亚洲综合久久影院d3| 亚洲AV无码一区东京热久久| 人人狠狠综合88综合久久| 91久久精品国产成人久久| 一级做a爰片久久毛片16| 国产成人精品久久免费动漫| 一本色道久久99一综合| 亚洲中文字幕无码久久2017| 国产精品久久新婚兰兰| 99久久综合国产精品免费| 99久久免费国产精品特黄| 午夜精品久久久久久影视riav| 久久久受www免费人成| 蜜桃麻豆www久久国产精品|