二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
实现
两种方法的时间复杂度和空间复杂度均为 O(1)
法1
每一位都与1相与,结果不等于0的就在sum上加1
public int NumberOf1(int n) {
int sum = 0;
int a = 1;
for (int i = 0; i < 32; i++) {
if ((n & a) == 1) {
sum++;
}
a <<= 1;
}
return sum;
}
法2
n 的最低位的1 永远 与 n-1 的最低位的0 对应,n 与 n-1 相与,会将最低位置为0,此时sum加1。当n 等于 0时,返回。
public int NumberOf1(int n) {
int sum = 0;
while (n != 0) {
sum++;
n = n & (n - 1);
}
return sum;
}