如何計算一個數字的二進位制形式裡1的個數?
阿新 • • 發佈:2018-12-21
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呢?
看到&運算,肯定是變成二進位制算,所以傳什麼就是多慮了。