Sword15——二进制中1的个数
方法1——位运算
- 思路:题目中是以二进制形式表示的数字,这也就提醒应该使用位运算。不仅如此,更重要的是因为找出一个数的中1的位数,必然要转化为二进制形式求解,这也暗示了使用位运算。统一思想就是通过消除最低位的1,并统计次数来求解
- 常用的两种消除方式
- 消除n最低位的1:n & (n - 1)
- n为1000 0010,n - 1为1000 0001,进行与运算后得到结果为1000 0000,即消去最低位上的1
- 获取n最低位的1:n & (~n + 1)
- n为1000 0010,~n为0111 1101,~n + 1为0111 1110,进行与运算后得到结果为0000 0010,即得到最低位上的1
- 特殊情况与临界分析:无
- 终止条件:当n为0时,证明此数二进制中已无1
- 步骤:
- 定义结果
- 循环条件:n不为0
- while循环
- 返回结果
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
n &= n - 1;
res++;
}
return res;
}
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
n -= n & (~n + 1);
res++;
}
return res;
}