题目描述:
请实现一个函数,输入一个整数,输出该二进制表示中1的个数
例:9的二进制表示为1001,有2位是1
方案一:
第一种方法:假设这个数是3,其二进制为011,首先将011&001,判断得出来的结果是否等于001,如果等于,说明这个第1位是1;然后将 011&010,判断得出来的结果是否等于010,如果等于,说明这个第2位是1,一直进行下去,判断31位
Scanner cin =new Scanner(System.in);
int n=cin.nextInt();
int cnt=0;
for(int i=0;i<32;i++) {
if(((i<<i)&n)==(i<<i)) {
cnt++;
}
}
System.out.println(cnt);
方案二:
第二种方法:只让要测验的数向右移。假设这个数是3,其二进制为011,首先将011&001,判断得出来的结果是否等于001,如果等于,说明这个 第1位是1;然后将001&001,判断得出来的结果是否等于001,如果等于,说明这个第2位是1,一直进行下去,判断31位
Scanner cin =new Scanner(System.in);
int n=cin.nextInt();
int cnt=0;
//方案二
for(int i=0;i<32;i++) {
if(((n>>>i)&1)==1) {
cnt++;
}
}
System.out.println(cnt);
方案三:
第三种方法:还是假设这个数是3,那我们让3变成0的过程中肯定是要消掉1的,消掉多少次1,就表示3的二进制中有多少个1。关键就在于,如何 消掉011中的1,我们首先让011减1,那么011就变成了010,然后让011&010,就得到了010,然后再让010减1,那么010就变成了001,然后让 010&001,就得到了000,转换成伪代码的形式就是,a = (a - 1) & a,它的效果就是消掉最低位上的1,依次消掉所有最低位上的1,最后不就变成了0吗
Scanner cin =new Scanner(System.in);
int n=cin.nextInt();
int cnt=0;
//方案三
while(n != 0) {
n = (n-1)&n;
cnt++;
}
System.out.println(cnt);