請(qǐng)編寫一個(gè)函數(shù),確定一個(gè)整數(shù)的計(jì)算機(jī)內(nèi)部表示中有幾個(gè)“1”。
思索了一下這個(gè)題目,我是這樣考慮的,也學(xué)書上給出偽代碼
count = 0;
while (這個(gè)整數(shù)不為0)
{
如果這個(gè)整數(shù)對(duì)2求余的結(jié)果是1,則count加1;
將這個(gè)整數(shù)向右移移位
}
代碼寫出來是這樣的:
















看了一下書中的答案,的確比我簡(jiǎn)練很多。對(duì)于求余這個(gè)方法還是比較笨的。書中采用了邏輯與。
判斷條件從“num%2 == 1”變成 “num&1 == 1”,從程序中更傾向與后者。
所以在分析問題的時(shí)候,要學(xué)會(huì)用邏輯“與、或、異或”進(jìn)行判斷。
到這一步,看似已經(jīng)很完美了。但是書中又出奇的給了另一種解法。這種想法我真的沒有想到。
想法的出發(fā)點(diǎn)是考慮一個(gè)數(shù)字減1時(shí),它的二進(jìn)制發(fā)生了什么變化。減1得到的結(jié)果是,從最低位的1到最低位都發(fā)生了翻轉(zhuǎn),其他高位保持不變。如果您對(duì)這個(gè)整數(shù)和減一后的結(jié)果進(jìn)行AND操作,得到的新的數(shù)字與原來的整數(shù)相比,只有最后一個(gè)1變成0.
如果進(jìn)行多次這樣的操作,這個(gè)整數(shù)的值變?yōu)?。這樣我們也就獲得了這個(gè)數(shù)的計(jì)算機(jī)表示中“1”的個(gè)數(shù)。














第一方法的時(shí)間復(fù)雜度為o(n),第二種的時(shí)間復(fù)雜度為o(m),m為1的個(gè)數(shù)。
后記:
最近一周多,一直在做這本書上的編程題。一天3道,自己先嘗試編寫,運(yùn)行成功后再與書上的解答進(jìn)行對(duì)比。稍有幾次略感比書上稍好些。但大多數(shù)情況還是效率差一些。想想原因,還是練得比較少。所以繼續(xù)努力。多多積累,養(yǎng)成良好的思維習(xí)慣。