n&(n-1)位運算的妙用

做oj遇到一道題,求二進制中1的個數。發現有大佬用來(n&n-1)。覺得很神奇。有空下來細想。確實是這麼個道理。記錄一下自己的分析過程

一、n-1發生了什麼

①、二進制數n,n-1後,如果最後一位是0,將向前一位借2,2-1=1。最後一位爲1。如果前一位爲0,將繼續向前一位借2,加上本身少掉的1.則變爲1。一直遇到1。減爲0.

所以 二進制 xxxx10000-1 = xxxx01111

②、n&n-1

按照上述 n=xxxx10000,n-1=xxxx01111

xxxx10000

xxxx01111


xxxx0000

可以看到將原來的最右邊的1變爲0了。

重複操作,有多少個1,這個操作就可以執行多少次。

貼上實現代碼

#include <iostream>  
#include <cstdio>  
using namespace std;  
int main()  
{  
    int n, count = 0;  
    cin>>n;  
    while(n > 0)  
    {  
        count++;  
        n&=(n-1);  
    }  
    cout<<count<<endl;  
    return 0;  
}
發佈了65 篇原創文章 · 獲贊 67 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章