《剑指offer》 第15题 二进制中1的个数

二进制中1的个数

https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

和1 与 为1,则为1,否则为0,因此用 与 操作来判断是否为1

思路1:
首先应该想到的是,先判断最右边的是否为1,然后整体右移一位,这样原来右边第二个数就被移动到最右边了,再判断;反复这样,就可以得到1的个数。
关键是这样的想法,在进行负数的个数统计时,会有问题,因为负数的二进制首位为1,移位后,为了保证还是负数,计算机会在首位再补1,这样不管你怎么移动,首位永远是1,陷入死循环。因此需要转变思路。

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while (n != 0) {
            if ((n & 1) == 1) {
                count++;
            }

            n = n >> 1;//把n的2进制形式往右推一位
        }
        return count;
    }
}

思路2:基于思路1的改进,既然原来的数右移可能会出问题,那就不移位。那原来的数不右移了,我用另一个数左移来相 与(相对运动可还行)。
flag 变化是 1 10 100 1000 ...
直到变成1000000..... 最终计算机认为你的首位是负数的标志时,再移动一次后,就全变成了0。此时为循环终止条件
那么代码如下

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        int flag = 1;
        while(flag != 0){
            if((n & flag) != 0){ //flag只有首位是1,其余位是0,相与为0,说明比较的当前位是0
                count ++;
            }
            flag = flag << 1;
        }
        return count;
    }
}

思路3:一个数的二进制减1后,原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 如1100 减1 变 1011。两数相与是1000,则这样的一次操作去掉了最右边的1(1100百位的1没了),利用这个规律进行解题。

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }
}

刷刷题

全部评论

相关推荐

到底什么时候能从池子里出来
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
07-31 14:40
门头沟学院 Java
牛客39712426...:触发重传机制了,可能是服务器负载太高了,ACK丢包了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务