统计一个整数的二进制中1的个数的三种解法

  1. #include <stdio.h>  
  2. /* 
  3.  *  统计一个整数的二进制中1的个数  
  4.  */  
  5.    
  6. // 解法1   
  7. int countOne(int num)  
  8. {  
  9.     int count = 0;  
  10.     while ( num )  
  11.     {  
  12.         // 当最后一位为1时,则加1   
  13.         if( num & 1 ){  
  14.             ++count;  
  15.         }  
  16.         num >>= 1;  
  17.     }  
  18.     return count;  
  19. }  
  20.   
  21. /* 解法2,比如当二进制中的1只有一个时,num & (num - 1)会等于0,以此判断即可。  
  22.  * 比如:    0000 0100 
  23.  *        & 0000 0011 
  24.  *        = 0000 0000     
  25.  */  
  26. int countOne2(int num)  
  27. {  
  28.     int count = 0;  
  29.     while ( num )  
  30.     {  
  31.         num &= (num - 1) ;  
  32.         ++count;      
  33.     }  
  34.       
  35.     return count;  
  36. }  
  37.   
  38.   
  39. // 解法3,查表法,将有限个数的对应的1的个数存在一个数组中,查表的时间复杂度为O(1),但是空间复杂度较大.  
  40. int countOne3(int num)  
  41. {  
  42.     // 列举了0到15 的表   
  43.     int countTable[16] = {  
  44.         0,1,1,2,  
  45.         1,2,2,3,  
  46.         1,2,2,3,  
  47.         2,3,3,4  
  48.     };    
  49.     if( num > MAX_SIZE && num < 0 ){  
  50.         return -1;  
  51.     }  
  52.       
  53.     return countTable[num];  
  54. }   
  55.   
  56. // main  
  57. int main(int argc, char *argv[])  
  58. {  
  59.     printf("count : %d.\n", countOne(5) );  
  60.     printf("count : %d.\n", countOne2(5) );  
  61.     printf("count : %d.\n", countOne3(5) );  
  62.     return 0;  
  63. }  
  64. 【本文转至】http://blog.csdn.net/bboyfeiyu/article/details/9235451
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值