题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
n&(n-1)可以处理最右边的1
如n = 01000100,n-1 = 01000011,n & (n - 1) = 01000000 这样就把最右边的1处理掉了。
每次循环只与1有关,不用将每位都循环到。
public int numberof1(int n) {
int sum = 0;
while(n != 0){
n = n & (n - 1);
sum++;
}
return sum;
}
n & (~n + 1)可以得到最右侧的1
如n = 01000100,n & (~n + 1) = 00000100 用n - (n & (~n + 1))就可以把最右边的1处理掉了
public int numberof2(int n) {
int sum = 0;
while(n != 0){
n =n - (n & (~n + 1));
sum++;
}
return sum;
}