剑指offer:二进制中1的个数

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

基本思路:先判断整数二进制表示中最右边是不是1,接着把输入的整数右移一位,在判断最右是不是1,直到整个整数变为0为止。
  1. int NumberOf1(int n)
  2. {
  3. int count=0;
  4. while(n)
  5. {
  6. if(n&1)
  7. count++;
  8. n=n>>1;
  9. }
  10. return count;
  11. }


为了避免死循环,可以不进行右移i.首先把i和1做与运算,判断i的最低位是不是为1,接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1,。。。。。。。。。。
  1. int NumberOf1_Solution1(int n)
  2. {
  3. int count = 0;
  4. unsigned int flag = 1;
  5. while(flag)
  6. {
  7. if(n & flag)
  8. count ++;
  9. flag = flag << 1;
  10. }
  11. return count;
  12. }

还有一种更优的解法:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
  1. int NumberOf1_Solution2(int n)
  2. {
  3. int count = 0;
  4. while (n)
  5. {
  6. ++ count;
  7. n = (n - 1) & n;
  8. }
  9. return count;
  10. }

















原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4665154.html