問題:計算某個數的二進制中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免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。