x&(x-1)的含義

來源:互聯網
上載者:User

求下面函數的傳回值(微軟) ---------統計1的個數
int func(int x)

{

int countx = 0;

while(x)

{

countx++;

x = x&(x-1);

}

return countx;

}

假定x = 9999

10011100001111

答案: 8

思路: 將x轉化為2進位,看含有的1的個數。
注:
每執行一次x = x&(x-1),會將x用二進位表示時最右邊的一個1變為0,因為x-1將會將該位(x用二進位表示時最右邊的那個1)變為0。(假設該位為第k位,減1後,該位後面全部變成1,但是由於該位是最右邊的1了,所以x的第k位後面全是0,而x-1的第k位是0,從1到k-1位全是1,按位與的結果自然就是第k位和1~k-1位都變成0。)
所以該運算式的用途之一:

1:將最低的為1的位變成0,這個解釋理解起來不難。

該運算式的第二個用途為:

2:當x為奇數的時候,x=x&(x-1)它的值相當於x=x-1;一樣的效果;當x為2的N次冪時,結果為0,這可以用來快速判斷一個數是否為2的n次方。
判斷一個數(x)是否是2的n次方

#include <stdio.h>

int func(int x)

{

if(
(x&(x-1)) == 0 )

return 1;

else

return 0;

}


int main()

{

int x = 8;

printf("%d\n", func(x));

}

注:

(1) 如果一個數是2的n次方,那麼這個數用二進位表示時其最高位為1,其餘位為0,然後利用上面的思路就很容易想通了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.