三种方法
第一种不断除2
除2可以用右移方式,但这种方式对于负数的话容易造成左边全为1,进入死循环
可以判断如果输入负数的话,取他的相反数,也就是取绝对值
第二种方法不断乘2,然后用n与该乘2的数做与,如果不为零,则说明该位有一个1
但这种方式这个不断乘2的数字要乘到溢出才完,可以设定while循环条件location乘以2小于n
第三种方法利用求最右边的1,也就是求一个数是否是2的k次方
如果n&(n-1)等于1的话,说明n为2的k次方
package numOf1InBinary10;
public class NumOf1InBinary10 {
static int sol1(int n) {
int count = 0;
while (n != 0) {
if (n % 2 == 1) {
count++;
}
n = n >> 1;
}
return count;
}
static int sol2(int n){
int count=0;
int location=1;
while (location!=0) {
if ((n&location)!=0) {
count++;
}
location=location<<1;
}
return count;
}
static int sol3(int n){
int count=0;
while (n!=0) {
count++;
n=n&(n-1);
}
return count;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(sol3(0));
// System.out.println((7&2));
}
}