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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

位運(yùn)算之美——用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法和取模(一)

??? 今天看了一位師兄去年的筆經(jīng)總結(jié),其中有一題是“不許用%和/來實(shí)現(xiàn)求任意數(shù)除以3的余數(shù)”,我想考官的目的應(yīng)該是想考察學(xué)生對位運(yùn)算的熟悉程度吧,于是我把題目擴(kuò)展成“只能用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法(/)和取模(%)”,注意:這里不能使用其它的庫例程來輔助計(jì)算,如log,log10等。在思考這道題目的過程中,我又涉及到了許多二進(jìn)制相關(guān)的題目,如:
??? 判斷給定的整數(shù)是不是2的整數(shù)次冪
??? 判斷給定的整數(shù)是不是4的整數(shù)次冪
??? 求給定整數(shù)的二進(jìn)制表示中1的個數(shù)
??? 求給定整數(shù)的二進(jìn)制表示中0的個數(shù)
??? 求給定整數(shù)的二進(jìn)制表示中最高位1的位置
??? 求大于等于給定整數(shù)的最小的2的整數(shù)次冪
??? 求給定整數(shù)的二進(jìn)制表示的有效位數(shù)
??? ...
??? 這些題目都是經(jīng)典老題,頻繁出現(xiàn)于各類筆試面試題中,除了能考察位運(yùn)算外,還能考察應(yīng)聘者能否給出創(chuàng)新的算法來更好地解決問題。可以說這些題目都不難,如果使用32位的int來表示整數(shù)的話,蠻力法都可以比較好地完成任務(wù),但是如果想盡可能地提高效率,那就需要動一番腦經(jīng)了。下面給出我對這些問題的整理和C++實(shí)現(xiàn),并在此基礎(chǔ)上給出原題(只能用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法(/)和取模(%),下文都稱為原題)的實(shí)現(xiàn)。
??? 當(dāng)然,從某種意義上講,特別是從充分利用底層硬件的計(jì)算能力(利用特殊的cpu指令)來看,這些解法肯定不是最優(yōu)的,希望大俠們多多指點(diǎn)。
??? 還要說明的是,下面各題的順序是按照我在思考原題時的思維過程來安排的,在給出原題的實(shí)現(xiàn)時會詳細(xì)說明。
??? 判斷給定的整數(shù)是不是2的整數(shù)次冪
??? 這應(yīng)該是最簡單的,利用最高位是1,其后所有位為0的特性,常數(shù)時間解決問題:
1?//判斷n是否是2的正整數(shù)冪
2?inline?bool?is_2exp(unsigned int?n)
3?{
4?????return?!(n&(n-1));
5?}

????求給定整數(shù)的二進(jìn)制表示中1的個數(shù)
????考慮到n-1會把n的二進(jìn)制表示中最低位的1置0并把其后的所有0置1,同時不改變此位置前的所有位,那么n&(n-1)即可消除這個最低位的1。這樣便有了比順序枚舉所有位更快的算法:循環(huán)消除最低位的1,循環(huán)次數(shù)即所求1的個數(shù)。此算法的時間復(fù)雜度為O(n的二進(jìn)制表示中的1的個數(shù)),最壞情況下的復(fù)雜度O(n的二進(jìn)制表示的總位數(shù))。
?1//計(jì)算n的二進(jìn)制表示中1的個數(shù)
?2inline?int?count1(unsigned int?n)
?3{
?4????int?r?=?0;
?5????while(n)
?6????{
?7????????n?&=?n-1;
?8????????r++;
?9????}

10????return?r;
11}
??? 既然有了求給定整數(shù)的二進(jìn)制表示中1的個數(shù)的辦法,那么想要求給定整數(shù)的二進(jìn)制表示中0的個數(shù)就很簡單了。事實(shí)上,在二進(jìn)制中,完全可以把0和1看作是對稱的兩個對象,取反操作(~)可以任意的切換這兩個對象,只要先對n進(jìn)行一次取反,然后再用上述算法即能得到二進(jìn)制表示中0的個數(shù)。首先看下面的代碼:
?1//計(jì)算n的二進(jìn)制表示中0的個數(shù)
?2inline?int?count0_wrong(unsigned int?n)
?3{
?4????int?r?=?0;
?5????n?&=?~n;
?6????while(n)
?7????{
?8????????n?&=?n-1;
?9????????r++;
10????}

11????return?r;
12}
??? 不知大家有沒有看出問題來?是的~操作符會把所有高位的都取反,而不是只把有效位取反,所以我們需要一個能保持高位不變的位取反操作,下面是我的實(shí)現(xiàn),時間復(fù)雜度和求二進(jìn)制表示中1的個數(shù)的算法相同,都與二進(jìn)制表示中1的個數(shù)有關(guān):
?1//保持高位取反
?2inline?unsigned int?negate_bits(unsigned int?n)
?3{
?4????if(n==0)?return?1;
?5????unsigned int?r=0,?m=~n;
?6????while(n)
?7????{
?8????????r?|=?(n^(n-1))&m;
?9????????n?&=?n-1;
10????}

11
12????return?r;
13}
??? 有了這個特殊的取反操作,求給定整數(shù)的二進(jìn)制表示中0的個數(shù)的辦法就簡單了:
?1//計(jì)算n的二進(jìn)制表示中0的個數(shù)
?2inline?int?count0(?unsigned?int?n)
?3{
?4????int?r?=?0;
?5????n?=?negate_bits(n);
?6????while(n)
?7????{
?8????????n?&=?n-1;
?9????????r++;
10????}

11????return?r;
12}
??? 看到這里,聰明的讀者肯定看出問題來了,其實(shí)我干了一件很蠢的事情。看看上述算法的時間復(fù)雜度,negate_bits花了O(n的二進(jìn)制表示中1的個數(shù)),while循環(huán)計(jì)算取反后的n的二進(jìn)制表示中1的個數(shù),事實(shí)上就是O(n的二進(jìn)制表示中0的個數(shù)),兩部分加起來其實(shí)就是二進(jìn)制表示總的有效位數(shù),換句話說,這個算法是線性的,而事實(shí)上,我們完全可以先線性地求出這個總的有效位數(shù),然后減去1的位數(shù),即得到0的位數(shù),根本不用費(fèi)那么大勁去整個保持高位的取反操作,兩者的時間復(fù)雜度在漸進(jìn)意義上也是相同的。所以,我犯傻了,但是這里又引出另一個問題:

????求給定整數(shù)的二進(jìn)制表示的有效位數(shù)
???
上面提到了線性地求這個位數(shù)(下文記為m),即“循環(huán)右移1位,記錄右移次數(shù)”,時間復(fù)雜度O(m)。但是我想,一看到這個題目,所有人的第一反應(yīng)應(yīng)該是floor(log2(n))+1吧,但是請注意,本文在一開始就規(guī)定了“不能使用庫例程”,那么在這個限制下該怎么做呢?有沒有比線性時間更好的算法呢?其實(shí)到目前為止我也沒有什么特別好的算法,希望誰有什么精妙的算法能指點(diǎn)一下,不要打我。。。
?1//求給定整數(shù)的二進(jìn)制表示的位數(shù),線性算法
?2int?count_bit_1(unsigned int?n)
?3{
?4????int?r?=?0;
?5????while(n)
?6????{
?7????????n>>=1;
?8????????r++;
?9????}

10????return?r;
11}

:???求大于等于給定整數(shù)的最小的2的整數(shù)次冪
????首先是最簡單的思路:求出n的二進(jìn)制表示的總位數(shù)m,于是1<<m即為所求值,當(dāng)然這里要排除n自身就是2的整數(shù)次冪的情況,復(fù)雜度O(m),實(shí)現(xiàn)如下:
?1//求大于等于n的最小的2的正整數(shù)冪,方法1
?2//時間復(fù)雜度O(n的二進(jìn)制位長度)
?3unsigned int?high_2exp_1(unsigned int?n)
?4{
?5????if(n<=1)?return?1;
?6????if(is_2exp(n))?return?n;
?7
?8????unsigned int?r?=?1;
?9????while(n)
10????{
11????????n?>>=?1;
12????????r?<<=?1;
13????}

14
15????return?r;
16}
??? 事實(shí)上這就涉及到上面求二進(jìn)制表示位數(shù)的問題,所以目前為止在此基礎(chǔ)上的算法都是線性時間的。???
??? 那有沒有不用計(jì)算位數(shù)m,從而效率更好的算法呢,能不能像在計(jì)算二進(jìn)制表示中1的個數(shù)時那樣根據(jù)1的個數(shù)來設(shè)計(jì)算法呢?回到那一題中,“n-1會把n的二進(jìn)制表示中最低位的1置0并把其后的所有0置1”,那么n|=n-1就把n的二進(jìn)制表示中最低位1后的所有0置1,再加上1,那么就把最低位1左移了一位。于是,便有了更好的算法:循環(huán)左移最低位的1,直到n是2的整數(shù)次冪。該算法跟二進(jìn)制表示中的1個數(shù)和位置有關(guān),最壞時間復(fù)雜度還是O(二進(jìn)制表示位數(shù)),但是比起上一個實(shí)現(xiàn),這個算法在多數(shù)情況下都比上一個算法快。實(shí)現(xiàn)如下:
?1//求大于等于n的最小的2的正整數(shù)冪,方法2
?2//計(jì)算時間與n的二進(jìn)制表示中1的個數(shù)和位置有關(guān),比方法1效率高
?3//最壞情況下的時間復(fù)雜度與方法1相同
?4unsigned int?high_2exp_2(unsigned int?n)
?5{
?6????if(n<=1)?return?1;
?7
?8????while(!is_2exp(n))
?9????{
10????????n?|=?n-1;
11????????n++;
12????}

13
14????return?n;
15}
????
??? 最后來一個簡單的擴(kuò)充題目:
??? 判斷給定的整數(shù)是不是4的整數(shù)次冪
????觀察4的整數(shù)次冪的特征,容易發(fā)現(xiàn)除了滿足n&(n-1)==0外,唯一的1位后的0的個數(shù)是偶數(shù),這從4x=22k也能簡單地得到。這就很直觀地衍生出一個簡單的算法:
?1//判斷n是否是4的整數(shù)次冪
?2bool?is_4exp(unsigned?int?n)
?3{
?4????if(!is_2exp(n))?return?false;
?5
?6????int?bit_len?=?count_bit_1(n)-1;//線性時間求二進(jìn)制位數(shù)
?7????if((bit_len&0x1)!=1)
?8????????return?true;
?9????else
10????????return?false;
11}
????算法很直觀,但是比起is_2exp的常數(shù)時間is_4exp的線性時間總讓我覺得不能接受,不過無奈還是沒有想出好辦法來,哎。。。求大牛指點(diǎn)啊

??? 說明:寫這篇文章,已經(jīng)三次丟失全文了,把我快搞瘋了,firefox下好像有點(diǎn)問題,先把文章發(fā)上來,過會兒換到IE下繼續(xù)。。。
??? 再說明:換了IE后就沒再出問題了,不過寫著寫著發(fā)現(xiàn)寫了好久,先歇會兒,得看書補(bǔ)習(xí)功課了
??? 最后的說明:下次會基于上面的內(nèi)容,給本文最初提出的問題(只能用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法(/)和取模(%))的實(shí)現(xiàn)

Feedback

# re: 位運(yùn)算之美——用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法和取模(一)   回復(fù)  更多評論   

2010-10-25 10:20 by yu
無意中逛到這里,驚喜之。

# re: 位運(yùn)算之美——用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法和取模(一)   回復(fù)  更多評論   

2010-11-18 16:06 by zl
最后的說明:下次會基于上面的內(nèi)容,給本文最初提出的問題(只能用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法(/)和取模(%))的實(shí)現(xiàn)
在那里?

# re: 位運(yùn)算之美——用+,-和位運(yùn)算實(shí)現(xiàn)整數(shù)除法和取模(一)   回復(fù)  更多評論   

2011-09-25 12:03 by skyworm
n &= ~n; // 寫錯啦,這個操作之后,n就永遠(yuǎn)等于0了。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久亚洲一区二区三区四区| 国产一区再线| 亚洲专区欧美专区| 亚洲与欧洲av电影| 亚洲免费综合| 久久精品视频在线观看| 狼人天天伊人久久| 欧美激情精品久久久六区热门| 欧美国产一区二区三区激情无套| 欧美成人小视频| 欧美色图一区二区三区| 国产欧美日韩精品a在线观看| 国产日韩欧美不卡| 亚洲精品乱码视频| 亚洲欧美日韩直播| 久久这里只有| 日韩视频精品在线观看| 性欧美在线看片a免费观看| 久久久久久久91| 欧美日韩在线不卡| 伊人久久亚洲影院| 亚洲一区二区三区影院| 久久夜色精品亚洲噜噜国产mv | 国产精品v亚洲精品v日韩精品 | 精品福利电影| 一区二区三区回区在观看免费视频| 亚洲中字在线| 亚洲第一视频| 午夜精品久久久久久久蜜桃app| 美女被久久久| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧洲在线视频| 久久综合激情| 亚洲欧美国产77777| 欧美大色视频| 伊人成人在线视频| 欧美在线综合| 亚洲特级片在线| 欧美日本免费| 亚洲伦理精品| 欧美成人福利视频| 欧美中文字幕视频| 国产欧美大片| 午夜国产精品视频| 一区二区三区蜜桃网| 欧美激情一区在线| 亚洲精品视频在线看| 久久免费视频在线| 欧美一区二区三区另类| 国产麻豆精品视频| 久久本道综合色狠狠五月| 一本色道久久| 亚洲欧美激情诱惑| 亚洲一区二区三区在线视频| 久久超碰97人人做人人爱| 国产精品国产三级国产aⅴ浪潮| 日韩午夜免费视频| 亚洲激情另类| 欧美人与禽性xxxxx杂性| 亚洲精品国产精品国产自| 裸体一区二区| 毛片一区二区三区| 亚洲精品久久久久中文字幕欢迎你| 久久久精品国产免费观看同学| 亚洲一二三区视频在线观看| 国产精品激情电影| 欧美一区二区三区久久精品茉莉花 | 久久亚洲精品一区| 久久婷婷蜜乳一本欲蜜臀| 亚洲成人资源网| 欧美高清视频一区| 欧美喷水视频| 午夜一区不卡| 久久国产一区二区| 亚洲日本中文字幕| 一本色道久久综合亚洲精品高清| 国产精品国产成人国产三级| 欧美影院成年免费版| 久久精品在线观看| 99精品国产在热久久| 一区二区三区欧美| 国产在线欧美日韩| 亚洲国产精品123| 欧美性猛交一区二区三区精品| 午夜精品一区二区三区四区| 欧美一区二区三区免费观看视频| 激情综合色丁香一区二区| 亚洲国产毛片完整版| 国产精品一区久久| 亚洲大片在线| 国产日韩欧美一区二区三区在线观看 | 99亚洲视频| 国产亚洲一区在线| 亚洲国产婷婷| 国产一区二区三区最好精华液| 欧美激情一区二区三区高清视频| 欧美日韩中文| 欧美成人在线免费视频| 国产精品福利在线| 欧美激情91| 国产视频亚洲精品| 亚洲精品在线观看视频| 国产在线视频欧美| 日韩亚洲欧美在线观看| 国产综合18久久久久久| 亚洲伦理在线观看| 在线视频观看日韩| 亚洲欧美中日韩| 久久久999精品免费| 亚洲免费观看高清完整版在线观看熊| 亚洲人成网站在线观看播放| 国产欧美日韩不卡| 亚洲精品在线观看视频| 亚洲高清网站| 久久精品久久99精品久久| 亚洲自拍电影| 欧美日韩国产色站一区二区三区| 久久日韩粉嫩一区二区三区 | 在线观看欧美日韩| 先锋影音久久久| 亚洲一区在线播放| 欧美日本在线看| 亚洲国产cao| 亚洲福利视频网站| 久久久久免费观看| 久久亚洲欧美| 韩国福利一区| 欧美专区福利在线| 久久久久高清| 国内精品久久久| 久久精品国产69国产精品亚洲| 欧美一二三区精品| 国产日产亚洲精品| 久久精品一区二区| 欧美国产日本| aⅴ色国产欧美| 欧美日韩成人在线观看| 亚洲精品影视在线观看| 一区二区三区高清| 国产精品久久久久久久久免费桃花 | 亚洲欧美在线免费观看| 午夜精品在线观看| 国产精品主播| 久久aⅴ国产欧美74aaa| 久久噜噜亚洲综合| 亚洲国产精品久久久久秋霞蜜臀| 久久视频在线视频| 亚洲高清在线| 亚洲无限av看| 国产视频一区在线观看一区免费| 久久成人综合网| 欧美国产精品劲爆| 9色porny自拍视频一区二区| 欧美午夜视频网站| 欧美一级免费视频| 欧美激情视频在线播放| 一区二区三区精密机械公司| 国产精品国产精品国产专区不蜜| 亚洲女同同性videoxma| 久久久夜色精品亚洲| 在线国产日韩| 欧美日韩一区不卡| 欧美一区二区三区在线视频| 欧美成人蜜桃| 亚洲专区一二三| 一区二区亚洲精品国产| 欧美日韩国产在线播放网站| 亚洲欧美日韩另类精品一区二区三区 | 另类图片国产| 亚洲视频在线播放| 欧美 日韩 国产在线| 狠狠色噜噜狠狠色综合久| 免费亚洲电影在线观看| 一本久道久久久| 国产欧美一区二区色老头| 久久久视频精品| 一区二区毛片| 欧美第一黄色网| 亚洲欧美制服另类日韩| 在线精品一区| 国产精品一区二区久久久| 男男成人高潮片免费网站| 亚洲伊人网站| 亚洲美女视频网| 免费观看成人网| 欧美中文字幕视频在线观看| 日韩亚洲精品在线| 在线播放不卡| 国产偷久久久精品专区| 欧美久久电影| 老色批av在线精品| 性视频1819p久久| 在线视频亚洲欧美| 亚洲国产免费| 欧美成人午夜免费视在线看片| 欧美一区日韩一区| 亚洲综合视频在线| 99精品国产热久久91蜜凸| 亚洲国产经典视频| 在线观看欧美一区|