二进制中1的个数

   请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数。

   解法一:要知道整数二进制表示中1的个数,可以先让该数与1做与操作,判断最后一位是否为1;之后再将1左移1位变为2,再和原数做与操作,判断原数倒数第二为是否为1,这样经过32此操作(整数4个字节,32位),便可以得到该数中1的个数。 

 1 #include<iostream>
 2 
 3 int NumberOf1(int n){
 4     int count = 0;
 5     unsigned int flag = 1;
 6     while(flag){
 7         if(flag & n)
 8             count++;
 9         flag <<= 1;
10     }
11     return count;
12 }
13 
14 int main(){
15     int inputNumber;
16     while(std::cin>>inputNumber){
17         std::cout<<NumberOf1(inputNumber)<<std::endl;
18     }
19     return 0;
20 }

       解法二:上面的算法需要移位32次,下面的方法可以使原数中有几个1就做多少次操作,对于一个二进制数,减去1,则二进制数中最右面的一个非0位会变为0,后面所有的位

变为1,原数与其减1的数做一个与操作,那么其最右面的一个1就变为了0,其他位保持不变,那么直到原数变为0为止,能有多少次这样的操作,就表示有几个1;例如1100,其减1为1011,1100&1011=1000,这是一次操作,第二次1000减1为0111,1000&0111=0000,第二次操作,一共有两次操作,实现代码如下:

 1 #include<iostream>
 2 
 3 int NumberOf1(int n){
 4     int count = 0;
 5     while(n){
 6         count++;
 7         n = (n-1)&n;
 8     }
 9     return count;
10 }
11 
12 int main(){
13     int inputNumber;
14     while(std::cin>>inputNumber){
15         std::cout<<NumberOf1(inputNumber)<<std::endl;
16     }
17     return 0;
18 }
原文地址:https://www.cnblogs.com/yangrenzhi/p/5775775.html