Come from : [https://leetcode-cn.com/problems/number-of-1-bits/]
191. Number of 1 Bits
1.Question
Write a function that takes an unsigned integer and return the number of ‘1’ bits it has (also known as the Hamming weight).
Example 1 :
Input: 00000000000000000000000000001011
Output: 3
Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.
Example 2 :
Input: 00000000000000000000000010000000
Output: 1
Explanation: The input binary string 00000000000000000000000010000000 has a total of one '1' bit.
Example 3 :
Input: 11111111111111111111111111111101
Output: 31
Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one '1' bits.
Note:
1. Note that in some languages such as Java, there is no unsigned integer type. In this case, the input will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.
2. In Java, the compiler represents the signed integers using 2's complement notation. Therefore, in Example 3 above the input represents the signed integer -3.
Follow up :
If this function is called many times, how would you optimize it?
2.Answer
easy 类型题目。
AC代码如下:
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while(n)
{
if(n%2 == 1)
{
++count;
}
n /= 2;
}
return count;
}
};
3.大神们的解决方案
方法1:
使用bitset操作,先使用bitset将无符号整数转换成32位二进制数,然后使用bitset中的count操作,计算出二进制中1的个数
class Solution {
public:
int hammingWeight(uint32_t n)
{
bitset<32> nums(n);
return nums.count(); //bitset中的函数count:返回二进制中标志位1出现的次数
}
};
方法2:
使用与操作和右移操作。提示:能使用移位操作,就尽量不使用除法操作~
class Solution
{
public:
int hammingWeight(uint32_t n)
{
int counts = 0;
while(n)
{
if(n&1)//对于n求余,余数是1,则可以使用此种操作来判断,n与1做按位与操作,若余数是1则此操作返回的是真即1,反之则反
counts++;
n = n>>1; //右移一位操作,相当于除以2,能使用移位操作别使用除法操作
}
return counts;
}
};
4.我的收获
Fighting~~~
位操作。。。
2019/5/24 胡云层 于南京 85