mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
update 191
This commit is contained in:
parent
77b44ee962
commit
ead7d75ba8
@ -3,9 +3,17 @@
|
||||
## 思路一
|
||||
不断循环,每次循环得到最低位的值,最后可得到所有位1的个数。怎样得到最低位的值,两种方法:
|
||||
* 1、若num为奇数,则num的最低位肯定为1;
|
||||
* 2、用一个只有低位是1的mask与num进行与操作即可得到最低位;
|
||||
* 2、用一个只有低位是1的mask与num进行与操作即可得到最低位(或者保持输入不变而不断左移mask);
|
||||
|
||||
**需要注意的是如果输入不是无符号型而是有符号型,那么如果输入的是负数,即符号位为1,那么右移高位会填1,最终会变成0xFFFFFFFF而陷入死循环。解决办法是保持输入不变而不断左移无符号的mask来判断输入的每一位是否为1.**
|
||||
|
||||
|
||||
## 思路二*
|
||||
依然是循环,但是每次循环不是得到最低位的值,而是每次循环去掉一个1,用一个count计数即可得到答案。
|
||||
依然是循环,但是每次循环不是得到最低位的值,而是每次循环去掉最低位的1,用一个count计数即可得到答案。**我们把原数减1,将结果和原数做与运算即可去掉最低位的1,即`n &= (n - 1)`。**
|
||||
|
||||
**此方法同样适用于输入为有符号型的情况。**
|
||||
|
||||
|
||||
# C++
|
||||
## 思路一
|
||||
``` C++
|
||||
@ -16,7 +24,7 @@ public:
|
||||
int res = 0;
|
||||
while(n != 0){
|
||||
res += (n % 2);
|
||||
n /= 2;
|
||||
n >>= 1; // 除法效率比移位低很多
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user