题解 | #二进制中1的个数#
二进制中1的个数
http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
/*
思路:最多32位,每次无符号右移一位,观察二进制的最后一位是否为1,若是1则计数加1
为什么是无符号右移?
答:有符号负数右移时高位会一直填充1,导致死循环。采用无符号,无论是正数还是负数右移,都是填充0
可以优化的地方?
答:学习自HashMap,可以用&运算来代替取模运算,完成判断最后一位是否为1的任务
*/
public class Solution {
public int NumberOf1(int n) {
int ans = 0; // 记录个数
while (n != 0) { // 为0时终止。因为正数和负数都是朝着0变化
if ((n&1)==1) ans++; // 取模,正数和负数都要考虑。但是正数和负数的最后一位不影响,仍然可以用&运算算出来
n = n >>> 1; // 无符号右移
}
return ans;
}
}