一、问题描述:
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '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;
}
四、运行结果: