如题:《剑指offer》c++版本 15.二进制中1的个数_死循环

平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1,如果是循环的话,容易引起死循环。举个例子:负数0x80000000,右移后不是0x40000000,而是0xC0000000,这是因为,移位后,仍要保证是负数,一直右移,最终得到0XFFFFFFFF,死循环。

为了解决上述问题,我们可以换个方式,上述方式是移位后和1比较,我们不移动数字,而是移动1,这里1左移,对于32位整型,将1左移31次即可,完美避开死循环问题。

下面是本题c++解法:

//使用bit位和数字逐个比较累加
class Solution {
public:
     int  NumberOf1(int n) {
         int cnt = 0, bit = 1;
         
         for (int i = 0; i < 32; i++)
         {
             //将bit左移
             if (n & (bit << i))
                 cnt++;
         }
         return cnt;
     }
};

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。