1. 程式人生 > >巧算二進位制中1的個數

巧算二進位制中1的個數

題目:給出一個正整數輸出其二進位制中1的個數
例如:

int  a=7;
//其二進位制表示:0000 0000 0000 0000 0000 0000 0000 0111
//其1的個數為3,輸出3

1.一般解法:
  一位一位判斷,移位加計數,統計出1的個數

int BitCount1(int num)
{
    int count = 0;
    while (num != 0)
    {
        if ((num & 1) == 1)
            count++;
        num=num >> 1;
    }
    return count;
}

2.快速判斷法:
  第一種方法需要一直移位判斷,直到num移位變為0為止,倘若其32個位中最低位為1,豈不是要迴圈32次才能判斷出其中1的個數,不理想。
  如果有這樣一種方法,我不需要迴圈那麼多次,你二進位制中有多少個1,我迴圈多少次並且計數多少次,減少迴圈次數?其實原理就是不斷清除二進位制中最右邊的那個位的1,同時累加計數器,直到num變為0。
  那麼問題關鍵就是如何消除最右邊那位的1。從二進位制角度看,num相當於在num-1的最低位上加1。

舉個栗子:

8(0000 1000)=7(0000 0111)+1(0000 0001)
8 & 7=(0000 1000)&(0000 0111)=0(0000 0000)//抹掉了8的最右邊的那位的1
6(0000 0110)=5(0000 0101)+1(0000 0001)
6 & 5=(0000 0110)&(0000 0101)=(0000 0100)//抹掉了6的最右邊的那位的1

  從上可見,num & (num-1)可以消去num最右邊那位的1

int BitCount(int num)
{
    int count = 0;
    while (num != 0)
    {
        num = num & (num - 1);
        count++;
    }
    return
count; }

原始碼戳這裡