题目描述

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

答案

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

解析

第一种方法是用1和输入的数字从右至左依次做&运算,当不为0的时候计数+1

第二种方法是跟它本身减一做与运算,可以省去不必要的比较判断
例子:现考虑二进制数:val :1101000, val-1: 1100111 那么val & (val-1) : 1100000


醉后不知天在水,满船清梦压星河