最简单最直接的做法:
class Solution {
public:int hammingWeight(uint32_t n)
{
int num = 0;
while (n != 0)
{
if (n % 2 != 0) // mod
{
num += 1;
}
n /=2; // division
}
return num;
}
};
这是最简单的一种方法,每一次对2求余都能得到目前该数的最后一位数字:如7是111,除以2得11,余数为1;然后11再除以2得1,余数为1;1再除以2得0,余数为1.所以三个1.
其实,这个方法很好理解,但是由于我们日常生活思考时用的十进制,所以对二进制的思考略微困难,那我们不妨用十进制来看一下:如若问你一个十进制数里有几个1,你怎么算呢(不写成二进制),如19181918,是不是先除以10,得1918191,余8,最后一位为8;再用1918191除以10,余1,最后一位为1,1的个数加1。。。每次除以该进制就可以得到该进制写法的最后一位数字是多少。
较快捷的做法:
class Solution {
public:
int hammingWeight(uint32_t n)
{
int num = 0;
while (n != 0)
{
n=(n-1)&n;
num += 1;
}
return num;
}
};
这里面用了一个非常巧妙的方法,即n=(n-1)&n,那这个能起到什么作用呢?我们举个栗子来看一下:若n=01010,则n-1为01001,两个求与为01000,发现了什么,成功消去了最后一位1,依次类推,能消去几个就代表几个1,所以该方法的执行速度与1的个数有关。而上一个算法的执行速度与该数最高位1所在的位数有关,如1000000000,虽然只有一个1,但必须执行10次。