求一个整数的二进制中1的个数

来源:互联网 发布:埋雷软件 编辑:程序博客网 时间:2024/05/20 00:14

题目:实现一个函数,输入一个整数,输出该整数二进制中1的个数

代码一:

int Find(int j)
 {
  int count = 0;
  while (j)
  {
  if (j & 1)
  count++;
  j = j>>1; 
  }
  return count;
 }

分析:

如果输入的整数是正数,那么可以输出结果。但是如果输入的是负数,要保证移位后的还是负数,所以移位后最高位需要设为1。如果一直做右移操作就会,调试的时候就会发现这个数就会变成一个很大的数,进入死循环。


代码二:

 int Find(int j)
   {
    unsigned int k = 1;
    int count = 0;
    while (k)
    {
    if (j&k)
    count++;
    k = k << 1;
    }
    return count;
   }

分析:

为了保证输入数据移位的时候不会出现死循环问题,就让k去移位,在和输入数据的每一位去按位与。但是这个代码的缺点就是,输入数据的二进制有多少位就要进行多少次的位操作。

代码三:

int Find(int j)
{
int count = 0;
while (j)
{
++count;
j = j&(j - 1);
}
return count;
}

分析:

把一个整数减去1,再和原来的整数做与操作,会把该整数最右边的1变成0,那么有多少个1就能做多少次这样的操作,这样就减少了位操作的次数。