//題目:寫一個函數返回參數二進制中的1的個數 // 比如:15 0000 1111 4個1 // 程序原型: int count_one_bit(unsigned int value) // { // //返回1的個數 // } #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; }
運行結果:
上面是第一種實現方法,用模2、除2的方法將數字進一步的統計二進制1的個數
除此之外還可以用通過for循環來使數字在計算器中移位比特位的方法,如下:
//00000000 00000000 00000000 00001111 //00000000 00000000 00000000 00000001 //00000000 00000000 00000000 00000111 //數字進入循環後右移0位,與1後爲1,統計一個1,i加1,一步一步循環統計 for(i=0; i<32; i++) { if(((n>>i)&1)==1) count++; }
這道題我們讓n和比它小1的數字相與,舉一些例子我們就不難發現,每次相與之後的數字的二進制就比n的二進制數字少一個1,並且每次都是少最右邊的那個1,因此我們還可以用這個方法來統計參數二進制1的個數:
while(n) { count++; //當參數能夠進入while循環時,說明條件爲真,它當中至少有一個1,所以先統計, //否則統計結果會少一個1 n = n&(n-1); }
到這兒,可能細心的人會發現,如果以上程序輸入-1時,程序是無法執行的,因爲我們給出的原型中是無符號整型,變量的最小範圍是0到65535,而整型的變量的最小範圍爲-32767到32767,要想正確統計-1的二進制1,只要將函數形參改成 int n 就可以了(只適用上面與或者移位運算的模塊程序)
如有補充,盡情評論指教