Day9:二进制中1的个数

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

示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

这个题目为了避免负数的影响,最好左移,左移的办法是选一个flag数,每次都左移一位,就得到一个1000...000的数刚好可以跟输入数对应位取与运算得到该位置是否为1.

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int flag = 1;
        int count = 0;
        for(int i = 0; i < 32; i++){
            if((n & flag) != 0){
                count++;
            }
            flag = flag << 1;
        }
        return count;
    }
}

 剑指offer里还有一种更巧的办法

一个整数减去1在于这个整数做位与运算相当于去掉其最右边的1,只要这个值不为0,每次做这种操作的时候计数。就可以去掉所有的1并得到1的个数。

class Solution {
    public int hammingWeight(int n) {
        int count =0;
        while(n != 0 ){
            n = n & (n - 1);
            count++;
        }
        return count;
    }
}

你可能感兴趣的:(算法)