用一個函數返回參數二進制中1的個數

//題目:寫一個函數返回參數二進制中的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;
}

運行結果:

wKiom1dhVRaQx5QlAAAEmH27luM043.png-wh_50



上面是第一種實現方法,用模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 就可以了(只適用上面與或者移位運算的模塊程序)

wKioL1dhVY6zMX9BAAAEGbybofI026.png-wh_50



如有補充,盡情評論指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章