LeetCode-191.位1的个数(C)

一、问题描述:

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

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路:

与(&):两个数中有一个数不是1,那么两者与的结果都为0,例如0&0=0,0&1=0,1&1=1。

n=n&(n-1),这句代码会使得二进制数中最接近末尾的一个1变成0,然后循环往复的循环,依次叠加循环次数,直到32位处理完成,循环的次数即为1的个数。

例如:n=11100,n-1=11011,n&(n-1)=11000;令n=11000,则n-1=10111,n&(n-1)=10000;令n=10000,则n-1=01111,n&(n-1)=00000,循环了3次,那么原二进制数中1的个数为3。

三、代码展示:

int hammingWeight(uint32_t n) {
    int sum=0;
    while(n){
        n=n&(n-1);
        sum++;
    }
    return sum;
}

四、运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值