一、题目描述
题目大意:输入一个整数,输出该32位二进制表示中1的个数。其中负数用补码表示。
注意审题:32位二进制表示的整数
二、算法1(暴力)
解题思路
- 依次检查二进制每一位,若当前位与(&)1为1,则计数器加1
 - 检查二进制的第k位 : n & (1 << k)
 
代码实现(C++11)
class Solution {
public:
     int  NumberOf1(int n) {
         int cnt = 0;
         for(int i = 0; i < 32; i++) {
             if(n & (1 << i)){    // 检查二进制的第i位
                 cnt++;
             }
         }
         return cnt;
     }
}; 时间复杂度:, k为n的位数, 这里为32
空间复杂度:, 常数空间
三、算法2(lowbit运算)
解题思路
- lowbit运算是一种经典的算法,它可以求得整数二进制表示下最后一位1,即若
,则
 - 通过lowbit运算,我们可以快速的取出整数二进制表示下的最后一位1,因此每取一次我们就计数一次,然后再去掉最后一位1,知道n = 0
 - 那么如何实现lowbit呢,我们可以先对n取反,然后再加1,这样就使得取反后的结果最后一位1与n对应,最后相与(&)就取出了最后一位1
 
 
代码实现(C++11)
class Solution {
public:
    // lowbit运算
    int lowbit(int n) {
        return n & (~n + 1);
    }
     int  NumberOf1(int n) {
         int cnt = 0;
         // 从低位到高位依次取出1
         for(int i = n; i; i -= lowbit(i)) {
             cnt++;
         }
         return cnt;
     }
}; 时间复杂度:, m为n二进制表示中1的个数
空间复杂度:, 常数空间

京公网安备 11010502036488号