溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用一個函數(shù)返回參數(shù)二進制中1的個數(shù)

發(fā)布時間:2020-06-15 10:43:13 來源:網(wǎng)絡 閱讀:380 作者:迎著風奔跑 欄目:編程語言
//題目:寫一個函數(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é)果:

用一個函數(shù)返回參數(shù)二進制中1的個數(shù)



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

用一個函數(shù)返回參數(shù)二進制中1的個數(shù)



如有補充,盡情評論指教

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI