C語言位運算應用一:求一個數的二進制表示中1的個數

上一篇文章中,我們提到了位運算這個概念,今天我們試着使用位運算來統計一個數的二進制表示中1的個數。

首先是頭文件:

#include<stdio.h>

#include<stdlib.h>

 

然後先寫出主函數:

int main()

{

    int num = 0;

    printf("請輸入一個整數:");

    scanf("%d",&num);

    printf("%d的二進制序列中有%d個1\n",  num,  BitCount(num));

    system("pause");

    return 0;

}

 

下一步是設計的個叫做BitCount的函數,傳入一個整型,返回傳入參數二進制表示中1的個數。

 

想要計算二進制中1的個數,必須用到位運算,上一篇文章中講到左移(<<)和右移(>>)符號,a>>n表示把一個數的二進制序列最右邊的n個位捨棄,再在最左邊補上n個符號位,左移則是往相反的方向進行操作,但左移規定補的是零。而這一個函數要用到的令一個位運算是按位與(&),爲的是判斷二進制序列某個位是否爲1。

 

我們要做的,是把每一個位提取出來,判斷其若是1,則讓初始值爲0的計數器自加。整型的二進制序列有32位,因此要做32次判斷,所以做一個for循環,循環內讓二進制序列與1(爲進制序列爲1)按位與,若結果爲1,則當前二進制序列最低位爲1;若結果爲0,則當前二進制序列最低位爲0。若當前二進制序列最低位爲1,則讓初始值爲0的計數器自加。每一次循環最後讓二進制序列右移一位,32次提取之後便能由計數器統計出二進制序列中1的個數。


寫出程序:

int BitCount (int num)

{

    int t = 0;

    int i = 0;

    for(i=0; i<32; i++)

    {

        if((num&1) == 1)

            t++;   

        num =(num>>1);

    }

    return t;

}

 

舉個例子,現在有一個整數13,二進制爲0000 0000 0000 0000 0000 0000 0000 1011,爲了方便說明,在此直接採用1011來代替以上二進制序列。第一次循環中,序列爲1011,與1相與,得到1,計數器自加後爲1;第二次循環中,序列爲0101,與1相與,得到1,計數器自加,爲2;第三次循環中,序列爲0010,與1相與,得到0,計數器不自加,仍爲2;第四次循環中,序列爲0001,與1相與,得到1,計數器自加後爲3。之後的循環中序列最低位都爲0,因此可以忽略,則在13的二進制序列當中有3個1,函數返回3。

看一下輸出結果:



此外,這個函數對於負數依然有效,大家可以試着像我剛剛那樣分析一下。

 

而現在的函數寫的較爲囉嗦,優化後得到:

int BitCount (int num)

{

    int t = 0;

    for(; num; num>>=1)

    {

        t +=num&1;

    }

    return t;

}

 

這題就完成了!大家有什麼問題或者更好的想法,可以在給我下方留言喔!

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