題目描述
題目分析
很自然地想到了二進制枚舉,直接循環檢查每一個二進制位。
class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;uint32_t t = 1;for (int i = 0; i < 32; ++i, t <<= 1) {if (n & t) {++ret;}}return ret;}
};
AC之后看了一下題解,發現還有更妙的方法:使用一個trick:n&(n-1)
的結果是把n的二進制位的最低位從1變為0。其實挺好理解的,因為n-1
肯定會將最低位1變成0,并把之后所有位變為1,使用&操作以后就可以消除掉。
有了上面的技巧,我們只需要不斷地將n
變為n&(n-1)
class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;while(n) { //必須首先判斷n是否為0++ret;n &= (n - 1);}return ret;}
};