計算二進制中1的個數

問題:計算某個數的二進制中1的個數

思路:x = x & (x-1) 將 x 的二進制最右面的一個 1 變爲 0,其餘保持不變。反覆操作,直到變爲 0 爲止,計算操作次數,即爲 x 的二進制中 1 的個數。

證明:假設 x 的二進制末尾爲 10...0 [末尾有 k 個 0,k = 0,1,2,...]。

則 x - 1 的二進制末尾 k+1 位爲 01...1 [末尾有 k 個 1,k = 0,1,2,...],其他與 x 相同。

從而 x & (x-1) 的末尾 k+1 位爲 00...0 [末尾有 k+1 個 0,k = 0,1,2,...],其他與 x 相同。

即 x = x & (x-1) 將 x 的最右邊的一個 1 變爲 0,其餘位數無變化。

C++程序:

#include <iostream>
using namespace std;

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

int main(){
    cout<<manyOne(9999)<<endl;
    return 0;
}
//Output: 8

類似問題:x = x | (x+1) 將 x 的二進制最右面的一個 0 變爲 1,其餘保持不變。

證明:假設 x 的二進制末尾爲 01...1 [末尾有 k 個 1,k = 0,1,2,...]。

則 x + 1 的二進制末尾 k+1 位爲 10...0 [末尾有 k 個 0,k = 0,1,2,...],其他與 x 相同。

從而 x | (x+1) 的末尾 k+1 位爲 11...1 [末尾有 k+1 個 1,k = 0,1,2,...],其他與 x 相同。

即 x = x | (x+1) 將 x 的最右邊的一個 0 變爲 1,其餘位數無變化。


應用:判斷一個整數 x 是否爲 2 的冪。

思路:假如 x 爲 2 的冪,則 x 只有最高位爲 1,其餘均爲 0,因此按照上面的做法 x = x & (x-1) 將會爲 0;反之,假如 x = x & (x-1) 爲 0,則 x 只有一位爲 1,其餘均爲 0,顯然 x 爲 2 的冪。

C++程序:

#include <iostream>
using namespace std;
int isTwoPow(int x){
    if( (x&(x-1)) == 0) return 1;
    else return 0;
} 
int main(){
    cout<<isTwoPow(256)<<endl;
    return 0;
}
//Output: 1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章