二进制中1的个数

来源:互联网 发布:淘宝咖啡店 编辑:程序博客网 时间:2024/06/07 07:15

题目:请实现一个函数,输入一个整数,输出该二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,。因此如果输入9,该函数输出2。

方法一:首先将n和1做与运算,判断n的最低位是否为1,接着将1左移1位,继续和n做与运算,这样反复左移,每次都能判断n其中的一位是不是1。

实现代码:

     int  NumberOf1(int n)      {         int count = 0;         unsigned int flag = 1;         while(flag)         {             if(n & flag)             {                 count++;             }             flag = flag << 1;         }         return count;     }

方法二:把一个整数减去1,再和原来的整数做与运算,会将该整数最右边的一个1变成0。

实现代码:

     int  NumberOf1(int n) {         int m = 0;         while(n){             m++;             n = n&(n-1);         }         return m;     }

方法三:

实现代码:

int  NumberOf1(int n) {     int temp = n;     temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1);     temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> 2);     temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4);     temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> 8);     temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> 16);      return temp;}

分析:

(n & 0x55555555) + ((n >> 1) & 0x55555555) 计算从低到高每一位相加,即相邻的2位中有几个1;(n & 0x33333333) + ((n >> 2) & 0x33333333) 计算从低到高每两位相加,即相邻的4位中有几个1 ;

接下来计算8位,16位,32位等,对于32位的机器来说,5条位运算语句就够了。

1 0