二进制数中1的个数

题目:

      请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如9(1001),有2个1。因此如果输入9,则该函数输出2。

普通法

思路:2看看余数是不是1,最多循环32次这种方法。

  1. int Count1(int v)  
  2. {  
  3.     int num = 0;  
  4.     while ( v )  
  5.     {  
  6.         if ( 1 == v%2 )  
  7.         {  
  8.             num++;  
  9.         }  
  10.         v = v/2;  
  11.     }  
  12.     return num;  
  13. }  
位移法

思路:向右移动一位相当于除2。

  1. int BitCount1(int v)  
  2. {  
  3.     int num = 0;  
  4.     for ( ; v; v>>=1 )  
  5.     {  
  6.         num += v&1;  
  7.     }  
  8.     return num;  
  9. }  

但是如果是负数的话,会出现死循环的情况。
因此,提出了改进版的位移法:(flag向左移)

  1. int BitCount1Opt(int n)  
  2. {  
  3.     int num = 0;  
  4.     unsigned int flag = 1;  
  5.     while ( flag )  
  6.     {  
  7.         if ( n&flag )  
  8.         {  
  9.             num++;  
  10.         }  
  11.         flag = flag << 1;  
  12.     }  
  13.   
  14.     return num;  
  15. }  
利用性质的更高效解法
思路:我们发现利用位移计算时,32位的整数需要循环32次。有没有更好的方法呢?整数中有几个1就只需要循环几次。
  1. int NumOf1(int n)  
  2. {  
  3.     int count = 0;  
  4.     while ( n )  
  5.     {  
  6.         count++;  
  7.         n = (n-1)&n;  
  8.     }  
  9.     return count;  
  10. }  

查表法

首先构造一个包含256个元素的表,table[i]即i对应的二进制数中1的个数。

然后对任意一个32位数分成4个8位,将4个8位中的1的个数相加就是该32位整数中1的个数。

并行法:

平行算法虽然时间复杂度不是很好,但很巧妙。先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。

21711011001)为例,有图有真相,下面的图足以说明一切了。217的二进制表示中有51



 


原文地址:点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值