题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
第一种方法:
return Integer.toBinaryString(n).replaceAll("0", "").length();//31ms 503k
第二种方法:
每次把n-1于n相与相当于把n中最后一位1去掉了。
以1100为例,n-1 = 1011,1100&1011 = 1000相与之后即使得1100中的第二位1变为0;
int count = 0;
while(n != 0){
count++;
n = n&(n-1);
}
return count;
第三种方法:
输入的n逻辑右移,取最后一位比较是否为1
int b =1;
int count = 0;
while( n != 0){
if((n&b) != 0) count++;
n = n >>> 1;//>>>为逻辑右移 , >>为算数右移
}
return count;
第四种方法:
设一个flags变量,让这个变量去检测n上每一位是否为1
int count = 0;
int flags = 1;
while( flags != 0){
<span style="white-space:pre"> </span>if((flags & n) != 0){
<span style="white-space:pre"> </span>count++;
<span style="white-space:pre"> </span>}
//System.out.println(Integer.toBinaryString(a)+" "+Integer.toBinaryString(flags)+" "+Integer.toBinaryString(a&flags) );
<span style="white-space:pre"> </span>flags = flags <<1;
}
return count;