题目描述:
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,(应该是输入9的二进制形式1001,一定是32位,用0补全)则该函数输出 2。
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
分析:解读起来就是有一个无符号位的32位二进制数,判断这个二进制数里有多少位数是1。这是一个用位运算解决问题的例子,我们可以让这个数和1做与运算,结果如果为0那么证明最后1位是0,结果为1,最后一位为1。然后右移一位,重复上述过程。因为与运算的运算规则是:0&0=0;0&1=0;1&0=0;1&1=1。然后32位二进制的1只有最后一位是1,前31位都是0,就可以得出最后结果。
右移 >> 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)此题已经说明了是无符号位,所以高位补0,不需要考虑。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while(n != 0){
if(n&1) count++;
n >>= 1;
}
return count;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof