首頁 - 網(wǎng)校 - 萬題庫 - 直播 - 雄鷹網(wǎng)校 - 團(tuán)購 - 書城 - ? - 學(xué)習(xí)通 - 導(dǎo)航 -
首頁網(wǎng)校萬題庫直播雄鷹網(wǎng)校團(tuán)購書城?論壇實(shí)用文檔作文大全寶寶起名
2015中考
法律碩士
2015高考
MBA考試
2015考研
MPA考試
在職研
中科院
考研培訓(xùn)
專升本
自學(xué)考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點(diǎn)日語
職稱英語
口譯筆譯
申碩英語
零起點(diǎn)韓語
商務(wù)英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點(diǎn)英語
托?荚
托業(yè)考試
零起點(diǎn)法語
雅思考試
成人英語三級
零起點(diǎn)德語
等級考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營 銷 師
司法考試
國際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱
法律顧問
ACCA考試
初級會(huì)計(jì)職稱
資產(chǎn)評估師
高級經(jīng)濟(jì)師
注冊會(huì)計(jì)師
高級會(huì)計(jì)師
美國注冊會(huì)計(jì)師
審計(jì)師考試
國際內(nèi)審師
注冊稅務(wù)師
理財(cái)規(guī)劃師
一級建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊測繪師
質(zhì)量工程師
巖土工程師
注冊給排水
造價(jià)員考試
注冊計(jì)量師
環(huán)保工程師
化工工程師
暖通工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
消防工程師
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評價(jià)師
土地登記代理人
寶寶起名
繽紛校園
實(shí)用文檔
入黨申請
英語學(xué)習(xí)
思想?yún)R報(bào)
作文大全
工作總結(jié)
求職招聘 論文下載 直播課堂
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員 > 正文

2015年軟件水平考試程序員精選題(11)

考試吧整理“2015年軟件水平考試程序員精選題(11)”供考生參考,更多軟件水平考試資訊和備考資料請關(guān)注考試吧軟件水平考試網(wǎng)。
  查看匯總:2015軟件水平考試程序員精選題匯總

  整數(shù)的二進(jìn)制表示中1的個(gè)數(shù)

  題目:輸入一個(gè)整數(shù),求該整數(shù)的二進(jìn)制表達(dá)中有多少個(gè)1。例如輸入10,由于其二進(jìn)制表示為1010,有兩個(gè)1,因此輸出2。

  分析:這是一道很基本的考查位運(yùn)算的面試題。包括微軟在內(nèi)的很多公司都曾采用過這道題。

  一個(gè)很基本的想法是,我們先判斷整數(shù)的最右邊一位是不是1。接著把整數(shù)右移一位,原來處于右邊第二位的數(shù)字現(xiàn)在被移到第一位了,再判斷是不是1。這樣每次移動(dòng)一位,直到這個(gè)整數(shù)變成0為止,F(xiàn)在的問題變成怎樣判斷一個(gè)整數(shù)的最右邊一位是不是1了。很簡單,如果它和整數(shù)1作與運(yùn)算。由于1除了最右邊一位以外,其他所有位都為0。因此如果與運(yùn)算的結(jié)果為1,表示整數(shù)的最右邊一位是1,否則是0。

  得到的代碼如下:

  ///////////////////////////////////////////////////////////////////////

  // Get how many 1s in an integer's binary expression

  ///////////////////////////////////////////////////////////////////////

  int NumberOf1_Solution1(int i)

  {

  int count = 0;

  while(i)

  {

  if(i & 1)

  count ++;

  i = i >> 1;

  }

  return count;

  }

  可能有讀者會(huì)問,整數(shù)右移一位在數(shù)學(xué)上是和除以2是等價(jià)的。那可不可以把上面的代碼中的右移運(yùn)算符換成除以2呢?答案是最好不要換成除法。因?yàn)槌ǖ男时纫莆贿\(yùn)算要低的多,在實(shí)際編程中如果可以應(yīng)盡可能地用移位運(yùn)算符代替乘除法。

  這個(gè)思路當(dāng)輸入i是正數(shù)時(shí)沒有問題,但當(dāng)輸入的i是一個(gè)負(fù)數(shù)時(shí),不但不能得到正確的1的個(gè)數(shù),還將導(dǎo)致死循環(huán)。以負(fù)數(shù)0x80000000為例,右移一位的時(shí)候,并不是簡單地把最高位的1移到第二位變成0x40000000,而是0xC0000000。這是因?yàn)橐莆磺笆莻(gè)負(fù)數(shù),仍然要保證移位后是個(gè)負(fù)數(shù),因此移位后的最高位會(huì)設(shè)為1。如果一直做右移運(yùn)算,最終這個(gè)數(shù)字就會(huì)變成0xFFFFFFFF而陷入死循環(huán)。

  為了避免死循環(huán),我們可以不右移輸入的數(shù)字i。首先i和1做與運(yùn)算,判斷i的最低位是不是為1。接著把1左移一位得到2,再和i做與運(yùn)算,就能判斷i的次高位是不是1……這樣反復(fù)左移,每次都能判斷i的其中一位是不是1;诖,我們得到如下代碼:

  ///////////////////////////////////////////////////////////////////////

  // Get how many 1s in an integer's binary expression

  ///////////////////////////////////////////////////////////////////////

  int NumberOf1_Solution2(int i)

  {

  int count = 0;

  unsigned int flag = 1;

  while(flag)

  {

  if(i & flag)

  count ++;

  flag = flag << 1;

  }

  return count;

  }

  另外一種思路是如果一個(gè)整數(shù)不為0,那么這個(gè)整數(shù)至少有一位是1。如果我們把這個(gè)整數(shù)減去1,那么原來處在整數(shù)最右邊的1就會(huì)變成0,原來在1后面的所有的0都會(huì)變成1。其余的所有位將不受到影響。舉個(gè)例子:一個(gè)二進(jìn)制數(shù)1100,從右邊數(shù)起的第三位是處于最右邊的一個(gè)1。減去1后,第三位變成0,它后面的兩位0變成1,而前面的1保持不變,因此得到結(jié)果是1011。

  我們發(fā)現(xiàn)減1的結(jié)果是把從最右邊一個(gè)1開始的所有位都取反了。這個(gè)時(shí)候如果我們再把原來的整數(shù)和減去1之后的結(jié)果做與運(yùn)算,從原來整數(shù)最右邊一個(gè)1那一位開始所有位都會(huì)變成0。如1100&1011=1000。也就是說,把一個(gè)整數(shù)減去1,再和原整數(shù)做與運(yùn)算,會(huì)把該整數(shù)最右邊一個(gè)1變成0。那么一個(gè)整數(shù)的二進(jìn)制有多少個(gè)1,就可以進(jìn)行多少次這樣的操作。

  這種思路對應(yīng)的代碼如下:

  ///////////////////////////////////////////////////////////////////////

  // Get how many 1s in an integer's binary expression

  ///////////////////////////////////////////////////////////////////////

  int NumberOf1_Solution3(int i)

  {

  int count = 0;

  while (i)

  {

  ++ count;

  i = (i - 1) & i;

  }

  return count;

  }

  相關(guān)推薦:

  2015年軟考信息技術(shù)處理員考前知識點(diǎn)總結(jié)匯總

  2015年軟件水平考試《程序員》提高練習(xí)題匯總

  2015軟件水平考試《程序員》知識點(diǎn)總結(jié)匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。
Copyright © 2004- 考試吧軟件水平考試網(wǎng) All Rights Reserved 
中國科學(xué)院研究生院權(quán)威支持(北京)
在線模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧