题目描述
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
解题思路
- 思路1
转换成二进制字符串,for循环统计字符1出现的次数,并返回 最终的和; - 思路2
遍历数字的 32 位,进行按位与运算,如果某一位是 1 ,计数器就加 1,在此过程中让辅助的与运算对象不断左移,这样来保证按位与; - 思路3
在思路2按位与的基础上进行优化,让n不断和和n - 1 进行与运算,并把每次与运算的结果赋值给n,这样能保证只要n 等于 0,那么统计就结束了,每进行一次与运算,就说明当前n的二进制中还有1存在。
代码(Java)
- 思路1
// 字符串 - 循环计数
public class Solution {
public int hammingWeight(int n){
int count = 0;
String str = Integer.toBinaryString(n);
for (int i = 0; i < str.length(); i++){
if (str.charAt(i) == '1'){
count ++;
}
}
return count;
}
}
- 思路2
// 按位与
public class Solution {
public int hammingWeight(int n){
int count = 0;
int mask = 1;
for (int i = 0; i < 32; i++) {
if ((n & mask) != 0) {
count++;
}
mask <<= 1;
}
return count;
}
}
- 思路3
// 优化的按位与
public class Solution {
public int hammingWeight(int n){
int count= 0;
while (n != 0) {
count++;
n &= (n - 1);
}
return count;
}
}