爱美容
当前位置: 首页 美容百科

整数的原码和反码和补码(一文搞明白位运算)

时间:2023-06-12 作者: 小编 阅读量: 1 栏目名: 美容百科

整数的原码和反码和补码在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。这样效率不高,能不能让计算机在进行运算时不用去管符号位,也就是说让符号位也参与运算,这就要用到反码。那么我们来看一下,用反码直接运算会是什么情况,我们以5-3举例。补码为了解决反码的问题就出现了补码。所以对于数字,我们可以使用补码的形式来进行二进制表示。

整数的原码和反码和补码?在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的,我来为大家科普一下关于整数的原码和反码和补码?以下内容希望对你有帮助!

整数的原码和反码和补码

在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。


正数位移运算


Java中有三个位移运算:



System.out.println(2 << 1);// 4System.out.println(2 >> 1);// 1System.out.println(2 >>> 1);// 1System.out.println(-2 << 1);// -4System.out.println(-2 >> 1);// -1System.out.println(-2 >>> 1);// 2147483647


乍一眼看到上面Demo的打印结果,你应该是懵逼的,接下来我来解释一下这个结果到底是如何运算出来的。

上面的Demo中有“2”和“-2”,这是两个十进制数,并且是int类型的(java中占四个字节),位运算是基于二进制bit来的,所以我们需要将十进制转换为二进制之后再进行运算



原码、反码、补码


接下来我们主要介绍十进制数用二进制表示的不同方法,所以为了简洁,我们用一个字节,也就是8个bit来表示二进制数。


原码

十进制原码20000 0010-21000 0010


原码其实是最容易理解的,只不过需要利用二进制中的第一位来表示符号位,0表示正数,1表示负数,所以可以看到,一个数字用二进制原码表示的话,取值范围是-111 1111 ~111 1111,换成十进制就是-127 ~ 127。


反码


在数学中我们有加减乘除,而对于计算机来说最好只有加法,这样计算机会更加简单高效,我们知道在数学中5-3=2,其实可以转换成5 (-3)=2,这就表示减法可以用加法表示,而乘法是加法的累积,除法是减法的累积,所以在计算机中只要有加法就够了。

一个数字用原码表示是容易理解的,但是需要单独的一个bit来表示符号位。并且在进行加法时,计算机需要先识别某个二进制原码是正数还是负数,识别出来之后再进行相应的运算。这样效率不高,能不能让计算机在进行运算时不用去管符号位,也就是说让符号位也参与运算,这就要用到反码。

十进制原码反码20000 00100000 0010-21000 00101111 1101


正数的反码和原码一样,负数的反码就是在原码的基础上符号位保持不变,其他位取反。

那么我们来看一下,用反码直接运算会是什么情况,我们以5-3举例。

5 - 3 等于 5(-3)

十进制原码反码50000 01010000 0101-31000 00111111 1100


5-3= 5 (-3)= 0000 0101(反码)1111 1100(反码) = 0000 0001(反码)= 0000 0001(原码) = 1


这不对呀?!! 5-3=1?,为什么差了1?

我们来看一个特殊的运算:


1-1= 1 (-1)= 0000 0001(反码)1111 1110(反码)= 1111 1111(反码)= 1000 0000(原码)= -0


我们来看一个特殊的运算:


0 0= 0000 0000(反码)0000 0000(反码)= 0000 0000(反码)= 0000 0000(原码)= 0


我们可以看到1000 0000表示-0,0000 0000表示0,虽然-0和0是一样的,但是在用原码和反码表示时是不同的,我们可以理解为在用一个字节表示数字取值范围时,这些数字中多了一个-0,所以导致我们在用反码直接运算时符号位可以直接参加运算,但是结果会不对。


补码


为了解决反码的问题就出现了补码。

十进制原码反码补码20000 00100000 00100000 0010-21000 00101111 11011111 1110


正数的补码和原码、反码一样,负数的补码就是反码 1。

十进制原码反码补码50000 01010000 01010000 0101-31000 00111111 11001111 1101


5-3= 5 (-3)= 0000 0101(补码)1111 1101(补码)= 0000 0010(补码)= 0000 0010(原码) = 2


5-3=2!!正确。

再来看特殊的:


1-1= 1 (-1)= 0000 0001(补码)1111 1111(补码)= 0000 0000(补码)= 0000 0000(原码)= 0


1-1=0!!正确

再来看一个特殊的运算:


0 0= 0000 0000(补码)0000 0000(补码)= 0000 0000(补码)= 0000 0000(原码)= 0


0 0=0!!也正确。

所以,我们可以看到补码解决了反码的问题。

所以对于数字,我们可以使用补码的形式来进行二进制表示。


负数位移运算


我们再来看-2 << 1与-2 >> 1。

-2用原码表示为10000000 00000000 00000000 00000010

-2用反码表示为11111111 11111111 11111111 11111101

-2用补码表示为11111111 11111111 11111111 11111110

-2 << 1,表示-2的补码左移一位后为11111111 11111111 11111111 11111100,该补码对应的反码为


11111111 11111111 11111111 11111100- 1= 11111111 11111111 11111111 11111011


该反码对应的原码为:符号位不变,其他位取反,为10000000 00000000 00000000 00000100,表示-4。

所以-2 << 1 = -4。

同理-2 >> 1是一样的计算方法,这里就不演示了。


无符号右移


上面在进行左移和右移时,我有一点没讲到,就是在对补码进行移动时,符号位是固定不动的,而无符号右移是指在进行移动时,符号位也会跟着一起移动

比如-2 >>> 1。

-2用原码表示为10000000 00000000 00000000 00000010

-2用反码表示为11111111 11111111 11111111 11111101

-2用补码表示为11111111 11111111 11111111 11111110

-2的补码右移1位为:01111111 11111111 11111111 11111111

右移后的补码对应的反码、原码为:01111111 11111111 11111111 11111111 (因为现在的符号位为0,表示正数,正数的原、反、补码都相同)

所以,对应的十进制为2147483647。

也就是-2 >>> 1 = 2147483647


总结


文章写的可能比较乱,希望大家能看懂,能有所收获。这里总结一下,我们可以发现:

2 << 1 = 4 = 2*2

2 << 2 = 8 = 2*2*2

2 << n = 2*2n

m << n = m * 2n

右移则相反,所以大家以后在源码中再看到位运算时,可以参考上面的公式。

    推荐阅读
  • 高中数学怎么才能开窍(怎样才能学好高中数学)

    高中数学怎么才能开窍课前预习是很多高中学生在学习数学过程中,容易忽视的环节。如果高中生在课前预习了,上课时老师讲的很多东西都是会有印象的。还有,上课的时候一定要打起全部的精神来听课,课上认真的听讲10分钟,会比自己课下学习一个小时效果还要好。很多高中生感觉课上自己什么都会,但是一做题就错误百出,这就是没有课后复习的结果。在课后,高中生要把当天学习的公式和定义都复习一遍,这样有利于巩固数学基础知识。

  • 怎么确定微信好友是否删除了自己(怎么确定微信好友是否删除了自己还是拉黑)

    如果对方把你删除的话,微信就会明确的提示”你还不是他(她)朋友。

  • 找工作面试应该注意哪些事项(找工作面试要注意的事情)

    找工作面试应该注意哪些事项?因此,面试时不要过于自信,也不要过于自卑,保持一颗平常心就好。愉悦的精神状态。面试时保持愉悦的精神状态非常重要,一个人的精神风貌对面试很有帮助。面试时如果心情愉悦的话,面部的表情会很自然,而且回答考官的问题时语言也会比较流畅,不容易紧张。

  • 马自达3新款2022款有什么不同(搭马力加大还有四驱)

    2023款马自达3即将在海外上市,根据官网提供的信息来看,其两厢版掀背车将于今年夏季末开始限量供应,不出意外,9月底应该会正式开售,不过目前来看只针对海外,引入国内的几率应该很小。该系统增强了稳定性,使驾驶更加平稳。黑色的运动尾翼饱满的尾部设计双边共两出的排气,自然而又大方,高级感满满。

  • 免费教程网站有哪些(老师傅常用网站)

    北风吹,春风暖。出现这种情况,不代表你想要的资源是没有的,很有可能是你找资源的“姿势”不对!

  • 鱼片粥怎么做好吃(鱼片粥好吃的做法)

    跟着小编一起来看一看吧!鱼片粥怎么做好吃食材:鱼肉200g,大米100g,生姜丝10g,料酒10g,香葱3根,盐、白胡椒少许。将大米洗净,浸泡30分钟。在砂锅中加入1200ML的水,大火烧开。将泡好的米放入砂锅中,转小火煮30分钟。在盛放鱼肉的容器中加入姜丝、白胡椒和料酒,腌制10分钟左右。将腌制好的鱼片放入粥锅中,用勺子快速搅拌。加入葱花,搅拌均匀,关火。

  • 好看的警匪电视剧剧情(求好看的电视剧推荐)

    克瑞案爆发后不久,北江市经侦支队正式成立,夏远凭借过硬的侦查功底和数学天赋,很快成为经侦支队的骨干力量,但王柏林却成了夏远的一个心结。公安部正式展开“猎狐”专项行动,夏远被上调参与,开始了境外追逃之路。最终,在历经了险象环生的跨国追缉、艰苦卓绝的自我突围后,夏远带领猎狐队员,将潜逃多年的经济罪魁们缉拿归案。

  • 怀孕多久可以测出来 怀孕多久可以测出来两条线很明显

    怀孕多久可以测出来1、早孕试纸检测早孕试纸检测怀孕时间一般在同房两周以后能检测出来,并且检测的尿液最好是晨尿,月经推迟5—10天后再检测,结果会更准确。怀孕初期有什么症状1、月经停止一般情况下,月经推迟七天左右是正常的,但是如果推迟了十天以上,就要检查一下是否怀孕。当然,有时候精神过度紧张以及一些妇科炎症都可能会导致月经推迟。所以,当月经推迟10天以上时可以去医院做进一步确认。

  • 天冷煤气中毒怎么处理(冬季煤气中毒怎么办)

    煤气中毒患者必须经医院的系统治疗后方可出院,有并发症或后遗症者出院后应口服药物或进行其他对症治疗,重度中毒患者需一两年才能完全治愈。检查煤气管道是否发生破损或老化,及时更换。同时,也可以使用肥皂水检查是否有气体泄漏。

  • 匈牙利人承认是匈奴人吗(真的是古代匈奴人的后裔吗)

    然而,国际史学界对此并不认同。▲匈奴与汉朝必须指出的是,匈奴并不是单一民族或部落,而是草原上许许多多民族或部落的总称。经过汉朝两百多年的持续打击,匈奴在公元46年左右彻底分裂为南北两部分,南匈奴归附汉朝,与汉人或其他草原民族融合,成为中华民族的一部分。匈人大军的骁勇和野蛮血腥给欧洲人留下极其深刻印象,称阿提拉为惩罚基督徒的“上帝之鞭”。突厥同样是众多民族和部落的混合体,很快分裂为东、西两部分。