剑指Offer 面试题10:二进制中1的个数

二进制中1的个数

题目描述

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示

解题思路

解法一

将被测试数字与数字1作按位与运算,根据运算结果得出被测试数字最低位是否为1。循环作右移操作,使被测试数字的32个二进制位逐一作为最低位

解法二

n & (n - 1)的结果是n的最右边1变为0,能做多少次操作则有多少个1

代码

解法一

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        int andNumber = 1;
        for(int i = 0; i < 32; i++) {
            int testResult = n & andNumber;
            if(testResult == 1) {
                count++;
            }
            n >>= 1;
        }
        return count;
    }
}

解法二

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