求二进制序列中1的个数

写leetcode遇到几个需要快速求二进制序列1的个数的题,故在此总结一下几种方法。

典型题目的链接

按位判断

这是最简单直观的方式,依次判断整数的每一位是否为 1 。

判断第 1 位:n & 1
判断第 2 位:n & (1 << 1)
判断第 n 位:n & (1<<(n-1))

class Solution {
    
    
public:
    int hammingWeight(uint32_t n) {
    
    
        int ret = 0;
        for (int i = 0; i < 32; i ++) {
    
    
            if (n & (1 << i)) {
    
    
                ret ++;
            }
        }
        return ret;
    }
};

快捷方法:N & (N - 1)​

使用这个方法,基于这样一个事实:

一个数 n 与一个比它小 1 的数(n−1)进行与运算(&)之后,得到的结果会消除 n 中最低位的 1

比如 :
7&6
00111 & 00110 =00110

可以看到,n&(n−1) 得到的结果,就是将 n 最低位 1 ,换成 0 之后的值。

每次都使用该运算法则消去 1 ,每运算一次计数器 +1,直至 n 为 0 。

class Solution {
    
    
public:
    int hammingWeight(uint32_t n) {
    
    
        int res = 0;
		while (n) {
    
    
			n = n&(n - 1);
			res++;
		}
		return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45605341/article/details/108033301