28 整数的二进制表示中1的个数

时间:2022-11-25 20:56:56
/*
28.整数的二进制表示中 1  的个数
题目:输入一个整数,求该整数的二进制表达中有多少个 1。
例如输入 10,由于其二进制表示为 1010,有两个 1,因此输出 2。
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

/*
其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0,
n-1与n相同除了最低位 n相当于在n-1的最低位加上1。

8(1000)= 7(0111)+ 1(0001),
所以8 & 7 = (1000)&(0111)= 0(0000),
清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。

再比如7(0111)= 6(0110)+ 1(0001),==>3
1:7 & 6 = (0111)&(0110)= 6(0110),
2:0110&0101=0100
3:0100&0011=0;

如果n的二进制表示中有k个1,那么这个方法只需要循环k次
*/ 
int count1(int n)
 {
	int c=0;
	while (n!=0) 
	{
		n=n&(n-1);
		c++;
	}
	return c;
}

int count2(int n)
 {
	int c=0;
	while(n)
    {
        if(n&1)
        //if(n%2==1)
        	c++;
    	n =n>>1;
    }
	return c;
}

int main()
{
	int n;
	
	while(cin>>n)
	{
		printf("%d:其二进制中总共有%d个1,对是%d个1\n",n,count1(n),count2(n));	
	} 
	return 0;
}