题解 | #二进制中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;  
    }
}

全部评论

相关推荐

那么好了好了:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务