剑指 Offer 15:二进制中1的个数

题目

题目链接
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。

示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'

示例 2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'

示例 3:

输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'

解题

方法一:循环检查二进制位

参考链接
我们可以直接循环检查给定整数 nn 的二进制位的每一位是否为 1。

具体代码中,当检查第 i i i位时,我们可以让 n n n 2 i 2^i 2i
进行与运算,当且仅当 n n n的第 i i i位为 1 1 1 时,运算结果不为 0 0 0

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


方法二:逐位判断

参考链接
在这里插入图片描述

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

方法三:位运算优化

在这里插入图片描述

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

Guess you like

Origin blog.csdn.net/qq_21539375/article/details/121515638