思路1 lowbit取最后一个1 再递减
如上 用lowbit的性质,取出最后一个1 再去减原数 直到原数为0
代码
class Solution {
public int lowbit(int x) {
return x & -x;
}
public int NumberOf1(int n)
{
int sum = 0;
while (n != 0) {
sum ++;
n -= lowbit(n);
}
return sum;
}
}
思路2 $n$按位与$2^i$
$2^i = 1 << i$
对于整数的二进制表示,当第i位为1时,有n & (1 << i) = (1 << i)
对于int
,当n为负数时,有n & (1 << 31) == (1 << 31)
,取得符号位为1
代码
class Solution {
public int NumberOf1(int n)
{
int sum = 0;
for (int i = 1; i != 0; i <<= 1) {
if ((n & i) == i) sum++;
}
return sum;
}
}
思路3 过滤符号位 整体右移依次&1
二进制数右移时,符号位若为1,则右移后自动补1,影响判断
因此考虑先过滤掉符号位但保留其它位状态,Java没有unsigned
且int
有32位,使用n&0x7fffffff
即可取后31位
数字依次右移,判断最后一位是否为1即可,注意加上符号位的1
代码
class Solution {
public int NumberOf1(int n)
{
int sum = 0;
if (n < 0) {
sum++;
n &= 0x7fffffff;
}
while (n > 0) {
sum += n & 1;
n >>= 1;
}
return sum;
}
}