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

一、每一位与0x1进行与运算

  1. int countOne(int num)  
  2. {  
  3.     int count = 0;  
  4.     while ( num )  
  5.     {  
  6.         if( num & 1 ){  
  7.             ++count;  
  8.         }  
  9.         num >>= 1;  
  10.     }  
  11.     return count;  
  12. }  
二、 //原理:一个数减去1,则这个数的二进制数中最后一个1及其后的数字取反。 x & (x - 1) 为它的二进制数中少一个1

  1. int countOne2(int num)  
  2. {  
  3.     int count = 0;  
  4.     while ( num )  
  5.     {  
  6.         num &= (num - 1) ;  
  7.         ++count;      
  8.     }  
  9.       
  10.     return count;  
  11. }  
三、 查表法,将有限个数的对应的1的个数存在一个数组中,查表的时间复杂度为O(1),但是空间复杂度较大.   

  1. int countOne3(int num)  
  2. {  
  3.     // 列举了0到15 的表   
  4.     int countTable[16] = {  
  5.         0,1,1,2,  
  6.         1,2,2,3,  
  7.         1,2,2,3,  
  8.         2,3,3,4  
  9.     };    
  10.     if( num > MAX_SIZE && num < 0 ){  
  11.         return -1;  
  12.     }  
  13.       
  14.     return countTable[num];  
  15. }   
  16.   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值