您好,登錄后才能下訂單哦!
//題目:寫一個函數(shù)返回參數(shù)二進制中的1的個數(shù) // 比如:15 0000 1111 4個1 // 程序原型: int count_one_bit(unsigned int value) // { // //返回1的個數(shù) // } #include<stdio.h> #include<stdlib.h> int count_one_bit(unsigned int value) { int count = 0; int n; while(n) { if(n%2==1) count++; n = n/2; } return count; } int main() { int n = 0; int ret = 0; scanf("%d",&n); ret = count_one_bit(n); printf("%d\n",ret); system("pause"); return 0; }
運行結(jié)果:
上面是第一種實現(xiàn)方法,用模2、除2的方法將數(shù)字進一步的統(tǒng)計二進制1的個數(shù)
除此之外還可以用通過for循環(huán)來使數(shù)字在計算器中移位比特位的方法,如下:
//00000000 00000000 00000000 00001111 //00000000 00000000 00000000 00000001 //00000000 00000000 00000000 00000111 //數(shù)字進入循環(huán)后右移0位,與1后為1,統(tǒng)計一個1,i加1,一步一步循環(huán)統(tǒng)計 for(i=0; i<32; i++) { if(((n>>i)&1)==1) count++; }
這道題我們讓n和比它小1的數(shù)字相與,舉一些例子我們就不難發(fā)現(xiàn),每次相與之后的數(shù)字的二進制就比n的二進制數(shù)字少一個1,并且每次都是少最右邊的那個1,因此我們還可以用這個方法來統(tǒng)計參數(shù)二進制1的個數(shù):
while(n) { count++; //當參數(shù)能夠進入while循環(huán)時,說明條件為真,它當中至少有一個1,所以先統(tǒng)計, //否則統(tǒng)計結(jié)果會少一個1 n = n&(n-1); }
到這兒,可能細心的人會發(fā)現(xiàn),如果以上程序輸入-1時,程序是無法執(zhí)行的,因為我們給出的原型中是無符號整型,變量的最小范圍是0到65535,而整型的變量的最小范圍為-32767到32767,要想正確統(tǒng)計-1的二進制1,只要將函數(shù)形參改成 int n 就可以了(只適用上面與或者移位運算的模塊程序)
如有補充,盡情評論指教
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。