1. 程式人生 > >快速的判斷一個數N的二進位制中有多少個1

快速的判斷一個數N的二進位制中有多少個1

方法1:

這裡涉及一個&的知識點,&是按位與,就是在一位一位的做與運算,
while(n>0) //這一句,當n不等於0的時候迴圈執行以下迴圈體,n等於0的變化條件在n>>=1這一句,將n左移一位,這樣當n中所有的”1”位都移出時,就跳出迴圈了
{
if((n&1)==1) //這句逐個通過位與的方式檢視當前n最左邊的一位是不是1,若是,則n&1=1,c加1用來計數
c++;
n>>=1;
}
return c;//這樣迴圈結束時就能得到所需的1的個數了
需要注意的是迴圈條件這部分很巧妙,保證當n的右邊沒有1的時候就不做迴圈了,可以假設n=1,迴圈體就只執行一次就跳出了,而不用遍歷n的每一位

方法2:

x=x&(x-1)

表示式的意思就是:把x的二進位制表示 從低位開始,將遇到的第一個為1的位元位 置0。

例如:

e1:
x = 01001000
x-1 = 01000111
x&(x-1)=01000000

e2:
x = 01001001
x-1 = 01001000
x&(x-1)=01001000

在迴圈中利用該表示式可以快速的判斷一個數的二進位制中有多少個1。

int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}

x=x&(x-1)還可以快速判斷x是不是2^n。當x為unsigned型別的變數,且其值為2的n次冪的時候,結果為零