标签:
三种方法
? ?
第一种不断除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));
}
? ?
}
标签:
原文地址:http://www.cnblogs.com/keedor/p/4381145.html