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

            換了個地址:http://www.cnblogs.com/vizhen/

             

            計算二進制中1的個數

            編寫一個函數返回數字的二進制位中‘1’的個數。

             

            方法一,遞歸

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

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

            方法二,google一下找出來的,沒看懂

            #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;
            }

            一下子看不明白,先把宏展開來:
            POW是計算2的冪
            MASK很奇怪,一個全1的無符號數字除以2的冪的冪加1?
            好在打印出來還能看得懂:

            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位數字劃分為幾個部分。每個部分的前一半和后一半分別是全'0'和全'1'。
            MASK(0)分為16個部分,MASK(1)分為8個部分,...
            ROUND中對n的處理:(n & MASK) + (n >> POW & MASK)
            POW的值剛好是MASK中連續'0'(或者連續'1')的長度。也就是說ROUND把由MASK分開的n的各個部分中的高POW位和低POW位相加。
            為了便于說明,取一個簡單的部分:MASK(1)的0011
            假設n的值為1001,那么ROUND后的結果就是10 + 01 = 11 b,把這個結果賦值給n,這時n的含義由原來的二進制位串變為'1'位的數量。特別的,當ROUND(n, 0)時,把n當作一個32個部分各自'1'位的數量。('0'表示沒有'1',而'1'則表示有1個'1')
            計算完n = ROUND(n, 0)后,n是一個16個部分各自'1'位數量的'數組',這個'數組'的每個元素只有2個二進制位。最大值為2,足夠由2個二進制位來表示。
            接下來,計算完n=ROUND(n,1)后,n是一個8個部分各自'1'位數量的'數組',這個'數組'的每個元素只有4個二進制位。最大值為4,足夠由4個二進制位來表示。(實際只需要3個二進制位)
            ...
            最后一步,計算n=ROUND(n,4)后,n是一個1個部分各自'1'位數量的'數組',這個'數組'的每個元素有32個二進制位。最大值為32,足夠由32個二進制位來表示。(實際只需要6個二進制位)
            這個代表32位內'1'位數量的32位二進制數也就是我們要求的結果。

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

            導航

            統計

            公告

            coding是我的寂寞,我是誰的寂寞

            隨筆分類(40)

            隨筆檔案(48)

            搜索

            積分與排名

            最新評論

            評論排行榜

            亚洲愉拍99热成人精品热久久 | 久久久国产精品亚洲一区| 国产精品久久婷婷六月丁香| 一本一本久久a久久综合精品蜜桃| 久久人人爽人人爽人人片AV麻烦 | 国产欧美久久一区二区| 99久久精品免费看国产一区二区三区 | 久久国产欧美日韩精品免费| 99久久精品国产一区二区| AV无码久久久久不卡蜜桃| 久久综合亚洲色HEZYO国产| 久久婷婷五月综合成人D啪| 久久精品视频免费| 中文字幕久久波多野结衣av| 97久久天天综合色天天综合色hd| 久久久免费观成人影院 | 久久人人青草97香蕉| 国产精品免费久久| 久久久久无码精品国产| 色综合合久久天天给综看| 国产国产成人精品久久| 日韩精品无码久久一区二区三| 精品久久久久香蕉网| 久久精品成人欧美大片| 久久精品无码一区二区三区日韩| 久久国产精品久久| 色偷偷88888欧美精品久久久| 热综合一本伊人久久精品| 伊人久久免费视频| 久久精品国产秦先生| 1000部精品久久久久久久久| 无码国产69精品久久久久网站| 久久久久亚洲av毛片大| 久久99精品国产麻豆蜜芽| 精品国产91久久久久久久| 91精品国产综合久久精品| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 国产精品日韩深夜福利久久| 精品久久久久久成人AV| 91久久婷婷国产综合精品青草| 亚洲精品乱码久久久久久 |