如题:
平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中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),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。