15.二进制中1的个数
题目:实现一个函数,输入一个樟树,输出该数二进制表示中1的个数。例如,输入9,9的二进制表示为1001,有2个1,我们输出2。
思路:
1.按位与上1,然后右移,直到为0.
2.按位与1,左移1,直到与的结果为0
3.原数减去1与上自身,直到自身为0
代码
public class CountNoOne {
public static void main(String[] args) {
int n = 9;
System.out.println(numberOf11(n));
System.out.println(numberOf12(n));
System.out.println(numberOf13(n));
}
/**
* 可能引起死循环,
* 我们只要按位与上1,
* 如果为真,那么说明二进制最右边是1,然后右移即可,直到完成
* 存在的问题:如果输入负数,负数的右移会出现问题,就会出现死循环
* @param n
* @return
*/
public static int numberOf11(int n){
int count = 0;
while (n != 0) {
if ((n & 1) != 0){
count++;
}
n = n >> 1;
}
return count;
}
/**
* 改进解法,
* 我们不动原数字,我们左移1,进行与运算
* @param n
* @return
*/
public static int numberOf12(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((flag & n) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}
/**
* 终极解法,我们把原数减去1,与上他本身
* 例如1001减去1 1000&1001,变为1000
* 1000再减去1,111&1000,变为0000,
* 我们就进行两次操作,说明里面只含有两个1
* @param n
* @return
*/
public static int numberOf13(int n) {
int count = 0;
while (n != 0){
count++;
n = n & (n - 1);
}
return count;
}
}