巧算二進位制中1的個數
阿新 • • 發佈:2019-01-25
題目:給出一個正整數輸出其二進位制中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;
}
原始碼戳這裡