输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法一:把n与1做与运算,判断最低位是不是1;把1左移一位得到2 (10),与n做与运算,判断次低位是不是1;……
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
while(flag != 0){
if((n&flag)!=0)
count++;
flag = flag << 1;
}
return count;
}
方法二: 把一个整数-1,都是把最右边的1变成0,如果右边还有0,则所有的0变1,而它左边的所有1不变。之后把这个整数和减1之后的结果做位与运算,相当于把它右侧的1变0。例如:1100,-1结果时1011,与运算1000,把1100最右边的1变成了0。
即:把一个整数减1,再和原整数与运算,会把该整数最右边的1变成0。那么,一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
++count;
n = (n-1)&n;
}
return count;
}