1. 程式人生 > >如何計算一個數字的二進位制形式裡1的個數?

如何計算一個數字的二進位制形式裡1的個數?

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

這道題其實是微軟的一道面試題。面試的原題為:

求下面函式的返回值

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

假定x = 9999,就函式的返回值。答案是8,即9999的二級制形式中1的個數。

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

別人的總結:

就用e1作為例子

第一次位於運算的結果是01000000

那麼繼續x-1,則x-1=00111111

那麼繼續位於運算:

01000000&00111111=00000000

此時迴圈的變數x為0,迴圈終止。

用來計數的countx也就是說明了二進位制數種有幾個1.

但是我們傳進去的引數是整數,例如傳9999呢?

看到&運算,肯定是變成二進位制算,所以傳什麼就是多慮了。