C語言 求乙個數字的二進位制中 1 的個數

2021-08-19 21:47:00 字數 1466 閱讀 3494

寫乙個程式列印指定數字的二進位制中 1 的個數,比如:15 (0000 1111)   輸出4

下面是三種方式:

①通過模2除2(%2、/2)的方法

num%2——取出二進位制的最後一位

num/2——右移去掉二進位制的最後一位

通過while迴圈,依次取出二進位制的最後一位數字判斷是否為1,若為1則count++,while(num)只有當num變為0時迴圈結束。

問題:在測試-1出現bug,-1的二進位制中應該有32個1,輸出卻為0。我們將-1帶入**中發現-1%2=0,count不增,然後-1/2=0,迴圈結束,故輸出count的值為0。

解決方案:將變數num的資料型別改為unsigned int (無符號整型),此時表示的是正的整型的最大值,所以當num=-1時,表示二進位制為32個1的正數,通過迴圈可以輸出正確的個數。

**1:

#include int main()

printf("二進位制中1的個數為:%d\n",count);

return 0;

}

②通過右移操作符(>>)、按位與操作符(&)實現

example:當num=10(1010),通過右移操作num>>i,二進位制向右移動i位。

//i=0,num>>0,右移0位,此時(1010)&(0001)=0

//i=1,num>>1,右移1位,此時(0101)&(0001)=1,count++

//i=2,num>>2,右移2位,此時(0010)&(0001)=0

//i=3,num>>3,右移3位,此時(0001)&(0001)=1,count++

因為二進位制共32位,所以迴圈要執行32次後結束,得到count為2。

缺點:不夠高效,必須迴圈32次

**2(優化1):

#include int count_one_bits(unsigned int value)

return count; // 返回1的位數

}int main()

③通過按位與操作符(&)巧妙運算實現

example:  當num=15時,

1//num&(num-1)=(1111)&(1110)=(1110)

2//num&(num-1)=(1110)&(1101)=(1100)

3//num&(num-1)=(1100)&(1011)=(1000)

4//num&(num-1)=(1000)&(0111)=0  ,迴圈停止。共執行4次while迴圈。

可以發現:每執行一次就去掉了最右邊的1,so~迴圈執行幾次就有幾個1啦~

高效!有幾個1就處理幾次

**3(優化2):

#include int main()

printf("二進位制中1的個數為:%d\n",count);

return 0;

}

求乙個數字二進位制中 1 的個數

任意給定乙個 32 位無符號的整數 n,計算 n 的二進位制表示中 1 的個數,比如 n 3 011 時,返回 2 通過移位解決,每次向右移一位 1 然後判斷最後一位是不是 1 1 最多迴圈 32 次 int bitcount unsigned int n n n 1 return count 使用...

二進位制 求乙個數的二進位制表示中1的個數

題目 求乙個正整數x中1的個數 思考 二進位制是乙個01串。統計該串中1的個數。方法1 將x按照樸素的方法轉化成二進位制串,如果x的某二進位制位上為1,則res 求得最後x中1的個數。int x while x return res res即是x的二進位制數中1的個數用這種方法求,時間複雜度為o n...

求二進位制中1的個數

在 程式設計之美 一書中有一節提到如何求乙個位元組的無符號整型變數二進位制表示中中1的個數,主要提到了四種方法。下面簡單介紹一下 1.求餘法 在將十進位制數轉換為二進位制數時,採用除2取餘法。將每次除2得到的餘數儲存起來逆序輸出便是該十進位制整數的二進位制表示。因此可以採用這種方法去統計1的個數。i...