可以使用移位运算符以及与“&”运算符来进行判断,无符号左移运算符<<,语法格式:需要移位的数字 << 移位的次数n。
运算规则:按二进制形式把所有数字向左移动相应的位数,高位移出(舍弃),低位的空位补0。相当于乘以2的n次方。
例如:4<<2 ,就是将数字4左移2位。
无符号右移运算符>>,语法格式:需要移位的数字>>移位的次数n。
运算规则:按二进制形式把所有数字向右移动相应的位数,低位移出(舍弃),高位的空位补0。相当于除以2的n次方。
例如:4>>2 ,就是将数字4左移2位。
思路就是:判断每个二进制数最右边是否为1,如果是1的话就count++(计数),也就是n&1
进行判断,这样就能得到最右边的一位。不是1的话进行右移一位,再判断,循环退出的条件是n=0就退出(右移位到最后肯定是为0)。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;//1的个数
while (n != 0)
{
if(n & 1 == 1)
{
count++;
}
n = n >> 1;
}
return count;
}
};
刚刚是统计右边1的个数,现在法2的思想就是统计消去1的个数,本质上其实是一样的,我们可以巧用n&(n-1)
这个算法来进行计算,循环跳出条件是n=0
,当n=0
即跳出,因为n&(n-1)
每次都会把最右边的1给消除掉(如果最右边有1的话)。每经历一次循环,就count++
,统计被消除1的个数。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while (n!=0)
{
count++;
n = n&(n-1);
}
return count;
}
};