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

旅途

如果想飛得高,就該把地平線忘掉

面試系列8--返回整數中為1的位數(優化版)

原題:

??Write the function int bitCount(short input) that takes a short as input and
? returns an int.? The function returns the number of bits set in the input
? variable.? For instance:
? bitCount(7) --> 3
? bitCount(2543) --> 9
? bitCount(11111) --> 9

? 該題在《面試系列1...》中有解答,網友一修指出了答案的缺點,并給出了另外一個效率極高的算法,非常感謝,貼出來跟大家分享。?

/*
?* 平均效率比較低,最壞情況要循環sizeof(x) * 8次。
?* 看看下面這個函數,是針對32位的,至于其它位數稍加修改就可以了。
?*
?* return number of bits set
?*/

unsigned int bitcount32(unsigned int x)
{
??? x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL); // 0-2 in 2 bits
??? x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL); // 0-4 in 4 bits
#if 1
??? // Version 1
??? x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL); // 0-8 in 8 bits
??? x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL); // 0-16 in 16 bits
??? x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL); // 0-31 in 32 bits
??? return x;
#else
??? // Version 2
??? x = (x + (x >> 4)) & 0x0f0f0f0fUL; // 0-8 in 4 bits
??? x += x >> 8; // 0-16 in 8 bits
??? x += x >> 16; // 0-32 in 8 bits
??? return x & 0xff;
#endif
}

補充一下:

因為網友一修給出的代碼中注釋比較少,而精煉的代碼又比較難理解,所以我來說說我的看法,如果有不對的地方,還請大家多多指導。

關于二進制數的理解,二進制數每一位只能為0和1,因此在這個地方,我們可以理解為每一位都可以表示該位中包含1的數目。

看第一行代碼:x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);

5的二進制是 0101,當x & 0x55555555UL得出的結果是保留了0, 2, 4, 6 ... , 30 位的值,即 0, 2, 4, 6 ,... , 30 位中包含1的數目;那么自然可以理解(x >> 1) & 0x55555555UL得出的結果是保留了1, 3, 5, 7, ... , 31 位的值,即 1, 3, 5, 7, ..., 31 位中包含1的數目。把兩者相加起來:

??? xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

? +0101 0101 0101 0101 0101 0101 0101 0101

------------------------------------------------------------------------

??? 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x??????????????????????????? (這里的x即為x中?0, 2, 4, ... , 30?位的值)

?

??? 0xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

? +0101 0101 0101 0101 0101 0101 0101 0101

------------------------------------------------------------------------

??? 0y0y 0y0y 0y0y 0y0y 0y0y 0y0y 0y0y 0y0y??????????????????????????? (這里的y即為x中 1, 3, 5 , ... , 31 位的值)

?

??? 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x 0x0x

? +0y0y 0y0y 0y0y 0y0y 0y0y 0y0y 0y0y 0y0y

------------------------------------------------------------------------

??? zz zz zz zz zz zz zz zz

??? 可以把32位的X數每兩位看成一個最小單元,x+y的值z即為這個兩位最小單元中,1的個數。可以看出,巧妙地把兩個加數種0的空間用來保存進位。那么到現在為止,我們就得到了數X中,每兩位為最小單位,每兩位中的數值表示著這兩位中1的個數。

??? 依此類推,接下來我們用同樣的方法計算以4位為最小單位,4位中的數值表示該4位中1的個數,即:x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);

??? 然后是 8位, 16位,當計算到以32位為最小單位,32位中的數值表示該32位中1的個數的時候,答案就揭曉了。

?

posted on 2007-09-05 01:17 旅途 閱讀(174) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩国产在线一区| 欧美高清视频一区二区三区在线观看| 国产精品久久久久毛片软件| 欧美大香线蕉线伊人久久国产精品| 久久久久久久久久久久久9999| 欧美一区二区视频在线观看| 午夜国产精品视频| 欧美一级大片在线观看| 欧美一级网站| 久久精品免视看| 麻豆av一区二区三区久久| 欧美成ee人免费视频| 亚洲国产精品美女| 欧美风情在线| 欧美日韩国产高清| 国产精品久99| 国产日产欧美一区| 尤物网精品视频| 亚洲精品中文字幕在线观看| 一本一本久久| 欧美一区成人| 欧美成年视频| 99精品欧美| 亚洲综合久久久久| 久久综合网色—综合色88| 欧美片在线播放| 国产视频丨精品|在线观看| 亚洲国产91精品在线观看| 一区二区三区欧美激情| 欧美伊人精品成人久久综合97| 老鸭窝91久久精品色噜噜导演| 亚洲国产精品成人综合色在线婷婷| 亚洲国产日韩欧美在线99| 亚洲作爱视频| 久久一二三区| 国产精品麻豆va在线播放| 一区视频在线看| 一区二区三区免费网站| 久久综合网络一区二区| 99在线精品观看| 久久一综合视频| 国产区在线观看成人精品| 99精品视频一区| 欧美暴力喷水在线| 午夜精品一区二区三区四区| 欧美另类99xxxxx| 在线精品视频一区二区| 久久99在线观看| 亚洲一区二区三区精品视频| 欧美日韩亚洲综合在线| 亚洲精品一区二| 女人天堂亚洲aⅴ在线观看| 午夜一级久久| 国产精品一二三视频| 一区二区三区成人| 亚洲国产一区二区三区在线播 | 91久久夜色精品国产网站| 亚洲在线电影| 欧美午夜激情小视频| 亚洲精品中文在线| 亚洲国产日日夜夜| 久久中文在线| 国内精品美女在线观看| 亚洲欧美中文日韩v在线观看| 亚洲经典一区| 免费看亚洲片| 在线观看视频欧美| 猛男gaygay欧美视频| 亚洲美女精品成人在线视频| 久久久综合香蕉尹人综合网| 欧美成在线视频| 欧美伊人影院| 国产日韩欧美在线视频观看| 国产美女精品视频免费观看| 激情文学综合丁香| 欧美一级视频免费在线观看| 一本色道久久88综合日韩精品| 免费在线观看一区二区| 韩国女主播一区二区三区| 久久成人免费网| 亚洲一二三区精品| 国产精品高精视频免费| 韩国久久久久| 亚洲制服av| 一区二区久久久久| 国产精品第一区| 亚洲欧美日韩精品一区二区| 亚洲午夜视频在线观看| 欧美v亚洲v综合ⅴ国产v| 欧美日韩日本视频| 亚洲一区久久久| 亚洲午夜在线观看视频在线| 国产乱人伦精品一区二区| 久久国产加勒比精品无码| 欧美在线播放视频| 亚洲高清久久| 亚洲午夜精品| 韩国精品在线观看| 亚洲高清在线观看一区| 欧美激情成人在线| 一区二区三区四区五区精品视频| 夜夜嗨av一区二区三区四季av | 亚洲一区二区三区视频播放| 国产精品白丝jk黑袜喷水| 亚洲黄色成人久久久| 亚洲一区二区免费视频| 国产一区二区三区免费不卡| 免费亚洲一区二区| 欧美日韩精品一区| 小嫩嫩精品导航| 久久久久久亚洲综合影院红桃| 91久久视频| 亚洲国产美女精品久久久久∴| 国产伦理一区| 欧美激情在线| 国产精品日韩二区| 亚洲第一精品福利| 国产欧美亚洲精品| 亚洲精品在线三区| 国内外成人免费激情在线视频| 亚洲片国产一区一级在线观看| 亚洲欧美激情四射在线日| 一区久久精品| 亚洲性夜色噜噜噜7777| 亚洲国产日韩一级| 午夜久久电影网| 亚洲福利视频免费观看| 久久久亚洲高清| 欧美风情在线观看| 久久国产毛片| 久久精品国产99精品国产亚洲性色| 日韩亚洲精品视频| 久久精品青青大伊人av| 亚洲午夜黄色| 老司机成人网| 欧美成人嫩草网站| 国产欧美一区二区白浆黑人| 亚洲经典自拍| 精久久久久久| 亚洲欧美日韩综合aⅴ视频| 9人人澡人人爽人人精品| 久久青青草原一区二区| 亚洲午夜视频在线观看| 久色成人在线| 久久视频在线免费观看| 国产精品久久久久久久午夜| 亚洲国产精品久久久久秋霞影院 | 性欧美1819性猛交| 欧美—级a级欧美特级ar全黄| 久久久久久高潮国产精品视| 国产精品久久中文| 夜夜爽99久久国产综合精品女不卡| 亚洲电影免费观看高清完整版| 免费久久精品视频| 国产亚洲欧美日韩日本| 在线视频你懂得一区| 在线亚洲国产精品网站| 欧美激情免费观看| 欧美黄色小视频| 亚洲国产精品久久久久久女王| 久久爱www久久做| 亚洲深夜福利网站| 国产午夜精品一区理论片飘花 | 亚洲自拍偷拍视频| 欧美日韩亚洲一区三区| 亚洲激情综合| 一区二区黄色| 欧美日一区二区在线观看| 亚洲精品久久久久久一区二区| 国产一区日韩一区| 欧美激情成人在线| 日韩视频一区二区三区在线播放免费观看| 亚洲精品日韩久久| 欧美日韩精品免费观看视一区二区| aa级大片欧美三级| 性欧美暴力猛交69hd| 国产日本欧美在线观看| 欧美mv日韩mv国产网站| 日韩亚洲视频在线| 久久av一区| 亚洲经典一区| 欧美先锋影音| 香蕉成人啪国产精品视频综合网| 久久午夜影视| 日韩一区二区精品| 国产精品男人爽免费视频1| 午夜在线不卡| 亚洲大片免费看| 亚洲黄页视频免费观看| 国产精品久久久久高潮| 99成人在线| 亚洲一区视频| 一区二区在线视频观看| 国产精品久久久久久五月尺| 亚洲男人第一网站| 欧美韩日一区二区三区| 亚洲一二三区精品| 黑人操亚洲美女惩罚| 欧美日韩国产精品一卡| 性欧美精品高清|