题解 | #JZ11二进制中1的个数#

二进制中1的个数

http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

n&(n-1) : 将n的最后一个1置为0.
    public int NumberOf1(int n) {
        int count =0;
        while(n!=0){
            count++;
            n=n&(n-1);
        }
        return count;
    }

注意 底层计算全部都是补码!! 包括-1
输入 4 输出 1
输入 -4 输出 30 (int 是32位的, -4的补码是 1,1111111...100, 32-2=30位。)

牛逼Plus 128-1=127

128: 1,000 0000 ; -1: 1,111 1111
128-1: 0, 111 1111 【太牛逼了! 欧亨利式妙蛙】

原码,反码,补码

原码:二进制表示,第一位是符号位。0正,1负。
反码:负数 原码除符号位外取反,正数同原码。
补码:负数 反码+1,正数同原码。

正数都一样,主要记负数:反码+1
内核没有减法,-1 是 +(-1)

位运算

在位运算中,符号位也参与运算。

位与(and):& (有0则0)
位或(or):|(有1则1)
位异或:^(相同为0,不同为1)
取反:~ (按位取反)

<< 将最高位舍去,末尾补0;
>> 最高位符号位不变。其余右移。
>>> 无符号右移,左边直接补0.

补码加法中的自然丢弃和溢出。

十进制数相加:(-15) + (-20) = (-35)
用补码计算,就会有自然丢弃的现象。

(-15) 补= 1111 0001
(-20) 补= 1110 1100
相加:--------
可得: (1)1101 1101

括号中的1,是进位,自然丢弃。

剩下的 1101 1101,就是(-35)补。


八位的补码,可以表示十进制数-128~+127。
运算结果超出这个范围,就溢出了。

十进制数计算:(+80) + (+90) = (+170)
用补码计算,就会有溢出。

(+80) 补= 0101 0000
(+90) 补= 0101 1010
相加:--------
可得: (0) 1010 1010

进位是0。
剩下的 1010 1010,却是(-86)补。

为什么不是 (+170)补?
就是因为,超出范围,溢出了。

全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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