刷题:二进制中1的个数

  • 题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解法1

  • idea:使用一个无符号数1逐步左移,分别于原来数字进行&运算,运算结果为1时count++;
  • code:
class Solution {
public:
     int  NumberOf1(int n) {
         unsigned int flag = 1;
         int count = 0;
         while (flag){
             if (n & flag)
                 count++;
             flag = flag << 1;
         }
         return count;
     }
};

解法2

  • 更快
  • idea: 当n&(n-1)时,会把最右边的第一个1给干掉。为什么呢,比如n=1时0x1&0x0=0;又如n=0x1100时,0x1100&0x1011=0x1000。原理很简单n-1时会跟左边的位借1导致减法后,最右边的1后边的数字全变为1,而最右边的1那一位会因为被借走而成为0。因此从那一位开始n-1与n完全不同,与运算后就把最右边的1给干掉了。
  • code
class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         while(n){
             count++;
             n = n & (n-1);
         }
         return count;
     }
};

猜你喜欢

转载自blog.csdn.net/nickkissbaby_/article/details/89243098