###题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
/===个人解题思路=/
//1.用count1记录1的个数;
//2.如果为负数,取绝对值,count1+1;
//3.做除2的运算和取余运算,余数不为0;count1+1;
//4.重复3,直到最后商为0。
//ps.自己的哪一个地方错误,自己学识有限,暂时弄不出来的。
/*public class Solution {
public int NumberOf1(int n) {
int count1 = 0;
if(n<0){
n = 0-n;
count1 +=1;
}
while(n!=0){
if(n%2!=0){ count1+=1;}
n=n/2;
}
return count1;
}
}
*/
/*==================官方思路============*/
/*
1.把这个数逐次 右移 然后和1 与,
2.就得到最低位的情况,其他位都为0,
3.如果最低位是0和1与 之后依旧 是0,如果是1,与之后还是1。
举例:一个二进制数1100,从右边数起第三位是处于最右边的一个1。
减去1后,得到的结果是1011.
如1100&1011=1000.把一个整数减去1,再和原整数做与运算,
会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,
就可以进行多少次这样的操作。*/
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0) {
count++;
n = n & (n - 1);
}
return count;
}
}