题目链接

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

思路

思路一: 利用lowbit函数作用每次计算出n的最低位1的位权,这样可以在$log(n)$次计算内

class Solution {
public:
     int  NumberOf1(int n) {
        int cnt=0;
         while(n){
             ++cnt;
             n-=(n)&(-n);
         }
         return cnt;
     }
};

思路二: $O(1)$玄学计算

class Solution {
public:
     int  NumberOf1(uint32_t n) {
        uint32_t tmp=n - ((n>>1) &033333333333)-((n>>2) &011111111111);
                return((tmp+(tmp>>3)) &030707070707) %63;
     }
};
Last modification:September 22nd, 2020 at 10:45 am