實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。例如,將9表示成二進(jìn)制為1001,有2位是1,因此如果輸入數(shù)字9,該函數(shù)輸出2。
我們擁有十余年網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站建設(shè)經(jīng)驗(yàn),從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁(yè)設(shè)計(jì)師為您提供的解決方案。為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、成都手機(jī)網(wǎng)站制作、HTML5、等業(yè)務(wù)。無(wú)論您有什么樣的網(wǎng)站設(shè)計(jì)或者設(shè)計(jì)方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計(jì)服務(wù)并滿足您的需求。如果讓我們將一個(gè)十進(jìn)制的數(shù)轉(zhuǎn)換成二進(jìn)制的表示,我們就會(huì)不停的模除模除2取它的余數(shù),因此,就可以用這樣的方法解決:
#include <iostream> using namespace std; size_t count_one_num(int n) { size_t count = 0; while(n != 0) { if((n % 2) == 1) count++; n /= 2; } return count; } int main() { int n = 7; size_t ret = count_one_num(n); cout<<"one number in "<<n<<" are: "<<ret<<endl; return 0; }
運(yùn)行程序:
我們知道,任何一個(gè)數(shù)用機(jī)器語(yǔ)言來(lái)表示都是0和1的組合,而C/C++中提供了這樣的一個(gè)運(yùn)算符,右移操作符“>>”和左移操作符“<<”,它們是將一個(gè)數(shù)的二進(jìn)制位進(jìn)行相應(yīng)的向左移位和向右移位,而在上面的問題中,可以不斷地將整數(shù)向右進(jìn)行移位,這樣取到其最低位的數(shù)字和1數(shù)字進(jìn)行相與,就能夠得知最低位上的數(shù)字是1還是0了;
但是提到移位操作符會(huì)存在一個(gè)問題,當(dāng)將一個(gè)數(shù)進(jìn)行左移時(shí),左邊的位會(huì)被丟棄,而右邊的位會(huì)補(bǔ)0;當(dāng)一個(gè)數(shù)進(jìn)行右移操作時(shí),右邊的位會(huì)被丟棄,那么左邊的補(bǔ)位會(huì)存在兩種情況:一種是邏輯移位,統(tǒng)一都補(bǔ)0;另一種是算數(shù)移位,會(huì)相應(yīng)的補(bǔ)符號(hào)位;因此,在設(shè)計(jì)循環(huán)判斷條件的時(shí)候,不能將判斷數(shù)字是否為0作為循環(huán)條件了,而是應(yīng)當(dāng)將整數(shù)的位數(shù)也就是32位作為循環(huán)終止的條件,程序如下:
size_t count_one_num(int n) { int i = 32; size_t count = 0; while(--i) { if((n & 1) == 1) ++count; n = n>>1; } return count; }
除了上面的方法,其實(shí)還有一種利用數(shù)字的二進(jìn)制來(lái)解決的辦法:可以想到,當(dāng)一個(gè)數(shù)不為0的時(shí)候,它的二進(jìn)制表示中至少有一個(gè)1,從而計(jì)數(shù)器就可以加1,然后就需要將二進(jìn)制中的1一個(gè)一個(gè)地剔除掉直到數(shù)字變?yōu)?,那除了移位怎樣才能辦到呢?可以將數(shù)字 =(數(shù)字)&(數(shù)字-1),因?yàn)橐粋€(gè)數(shù)字減1的時(shí)候,它最低位的一個(gè)1就會(huì)變成0,而最低位的1肯定都是0就會(huì)都變成1,也就相當(dāng)于將數(shù)字12的二進(jìn)制減1就為將1100減1變成了1011值為11,然后將1100和1011進(jìn)行相&,那么就會(huì)變成1000,也就是成功的將12中的兩個(gè)1變成了一個(gè)1,以此類推就可以統(tǒng)計(jì)出二進(jìn)制中1的個(gè)數(shù)了,代碼實(shí)現(xiàn)如下:
size_t count_one_num(int n) { size_t count = 0; while(n != 0) { ++count; n = n & (n-1); } return count; }
這樣的代碼是不是比前兩種更簡(jiǎn)潔直觀呢,只是在理解上要稍微轉(zhuǎn)一下彎。
《完》
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)站欄目:一個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)——10-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article46/dpdceg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、商城網(wǎng)站、云服務(wù)器、網(wǎng)站排名、企業(yè)網(wǎng)站制作、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容