统计一个整数的二进制中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.   


你可能感兴趣的:(IT)