正整数的二进制中1的个数

来源:互联网 发布:凯哥学堂java ee 编辑:程序博客网 时间:2024/05/17 03:21
输入描述: 输入一个整数(int类型)
输出描述: 这个数转换成2进制后,输出1的个数
输入例子: 5
输出例子: 2

【一解】
  1. int main()
  2. {
  3.   int n;
  4.   while(cin>>n)
  5.   {  
  6.     int count=0;
  7.     while(n!=0)
  8.     { 
  9.       count++;
  10.       n=n&(n-1); //经典
  11.     }
  12.      cout<<count<<endl;
  13.  }
  14. return 0;
  15. }

【二解】
#include<iostream> 
usin gnamespace std; 
int main()
{   int t;
    cin>>t;
    int count=0;
    while(t>0)
    {   if(t%2)  count++;
        t=t/2;
    }
    cout<<count<<endl;
}


【求正整数二进制中最大数连续1的个数】


  • int main()
  • {
  •   int n;
  •   while(cin>>n)
  •   {  
  •     int count=0;
  •     while(n!=0)
  •     { 
  •       count++;
  •       n=n&(n<<1);    //经典
  •     }
  •      cout<<count<<endl;
  •  }
  • return 0;
  • }

  •  ******************** 相关问题 **************

    n&(n-1) 原理 :n与n-1的区别在于,对于n,从右向左数的第一个"1"开始一直到右,和n-1完全相反
    n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:
    n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000
    可以看到原本最低位为1的那位变为0。
    弄明白了n&(n-1)的作用,那它有哪些应用?
    1. 求某一个数的二进制表示中1的个数
    while (n >0 ) {
          count ++;
          n &= (n-1);
    }


    2. 判断一个数是否是2的方幂
    n > 0 && ((n & (n - 1)) == 0 )

    3. 计算N!的质因数2的个数。
    容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + ....
    下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示)
    现在我们跟踪最高位的1,不考虑其他位假定为0,
    则在
    [N / 2]    01000
    [N / 4]    00100
    [N / 8]    00010
    [N / 8]    00001
    则所有相加等于01111 = 10000 - 1
    由此推及其他位可得:(10101)!的质因数2的个数为10000 - 1 + 00100 - 1 + 00001 - 1 = 10101 - 3(二进制表示中1的个数)

    推及一般N!的质因数2的个数为N - (N二进制表示中1的个数)


    *********************************  十进制转化为二进制

    1. int main()
    2.   {  
    3.     int num;
    4.     while(cin>>num)
    5.     { 
    6.       cout<< (num & 1)
    7.       num>>1;
    8.     }
    9.   cout<<endl;
    10.  return 0;
    11.  }
    12. .
    13. --------------------------------------
    14. #include<bitset>
    15. #include<iostream>
    16. int main()
    17. {
    18.   int a=8;
    19.   bitset<32> bs(a);   //注意
    20.   cout<<bs<<endl;
    21.   return 0;
    22. }
    1. .
    2. ----------------------------------------
    3. void Binary(n)
    4. {
    5.   if(n>1)  
    6.      Binary(n/2);
    7.   printf("%d", n%2);
    8. }







  • int main()
  • {
  •   int n;
  •   while(cin>>n)
  •   {  
  •     int count=0;
  •     while(n!=0)
  •     { 
  •       count++;
  •       n=n&(n-1); //经典
  •     }
  •      cout<<count<<endl;
  •  }
  • return 0;
  • }
  • 0 0