From ead7d75ba867bac77a937a06ee28b6312d47bcc8 Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Fri, 31 Jan 2020 12:41:29 +0800 Subject: [PATCH] update 191 --- solutions/191. Number of 1 Bits.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/solutions/191. Number of 1 Bits.md b/solutions/191. Number of 1 Bits.md index dc70916..8cec493 100644 --- a/solutions/191. Number of 1 Bits.md +++ b/solutions/191. Number of 1 Bits.md @@ -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; }