快速了解原码、反码、补码和位运算
创始人
2024-05-30 17:03:46
0

我们知道计算机使用的是二进制,我们⽤⼀个字节,也就是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

计算结果为1,为什么差了1?我们来看⼀个特殊的运算:1-1

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

0+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
= 5+(-3)
= 0000 0101(补码) + 1111 1101(补码)
= 0000 0010(补码)
= 0000 0010(原码)
= 2

5-3=2,结果真确。再来看一个特殊的:1-1

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

继续:0+0

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

所以,我们可以看到补码解决了反码的问题。 所以对于数字,我们可以使⽤补码的形式来进⾏⼆进制表示。

位移运算

java中的位移运算有:

 < 左移

  > 右移

>>> ⽆符号右移

正数位移运算

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

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

2<<1 :⼗进制“2”转换成⼆进制为“00000000 00000000 00000000 00000010”,再将⼆进制左移⼀位,⾼位丢弃,低位补0,所以结果为“00000000 00000000 00000000 00000100”,换算 成⼗进制则为“4”。(一个数字左移N位相当于乘以2的N次方)。

2>>1: ⼗进制“2”转换成⼆进制为“00000000 00000000 00000000 00000010”,再将⼆进制 右移⼀位,低位丢弃,⾼位补0,所以结果为“00000000 00000000 00000000 00000001”,换算 成⼗进制则为“1" 。(一个数右移N位相当于除以2的N次方)。

对于这两种情况⾮常好理解,那什么是⽆符号右移,以及负数是怎么运算的呢? 我们先来看 -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 是⼀样的计算⽅法,这⾥就不演示了。

⽆符号右移

上⾯在进⾏左移和右移时,有一点需要注意,就是在对补码进⾏移动时,符号位是固定不动的,⽽⽆符号 右移是指在进⾏移动时,符号位也会跟着⼀起移动。 ⽐如 -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*2 m << n = m * 2 右移则相反,所以⼤家以后在源码中再看到位运算时,可以参考上⾯的公式。

相关内容

热门资讯

美剧经典台词 美剧精选经典台词  在快速变化和不断变革的今天,能够利用到台词的场合越来越多,台词是一种特殊的,也是...
朗诵会主持词 关于朗诵会主持词4篇  主持词要根据活动对象的不同去设置不同的主持词。在当下这个社会中,很多场合都需...
记者节晚会主持词 记者节晚会主持词  主持词是主持人在台上表演的灵魂之所在。随着社会一步步向前发展,主持词的实用频率越...
婚礼父亲致辞 婚礼父亲致辞(精选15篇)  在平凡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有“礼...
校园红歌赛的主持词 校园红歌赛的主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在现今人们越来越重视活动氛...
开业主持词开场白 开业主持词开场白  根据活动对象的不同,需要设置不同的主持词。在当今社会生活中,活动集会越来越多,主...
关于唱歌比赛主持词   主持词是指主持人在主持节目的过程中进行节目串联的串联词,一般由开场白、中间部分与结束语组成。以下...
动漫感人台词 动漫感人台词(通用175句)  台词可以刻画人物的性格,表现人物的感情,加强剧情的表现力。那些广为流...
最新年会主持词 最新年会主持词(精选11篇)  契合现场环境的主持词能给集会带来双倍的效果。在如今这个时代,主持人的...
新生文艺汇演主持词 新生文艺汇演主持词  主持词要根据活动对象的不同去设置不同的主持词。在当今社会生活中,各种集会的节目...
家长代表幼儿园毕业典礼主持词 家长代表幼儿园毕业典礼主持词  主持词是各种演出活动和集会中主持人串联节目的串联词。在人们积极参与各...
学校元旦晚会主持词开场白和结... 学校元旦晚会主持词开场白和结束语  2017年元旦晚会主持词怎么写?怎么开场比较好呢?结束语又该怎么...
毕业晚会致辞 毕业晚会致辞(精选18篇)  在学习、工作或生活中,大家都写过致辞吧,致辞要求风格的雅、俗、庄、谐要...
幼儿园六一节目串词 幼儿园六一节目串词红黄蓝幼第一文库网儿园节目串词主持人(师):亲爱的家长朋友们( ):敬爱的老师们(...
祝寿主持词 祝寿主持词  主持词要尽量增加文化内涵、寓教于乐,不断提高观众的文化知识和素养。在人们积极参与各种活...
回门宴主持词 让你的回门宴顺... 回门宴主持词 让你的回门宴顺利完成  篇一:新婚回门宴主持词  亲爱的各位来宾,各位亲朋好友,先生们...
结婚新郎致辞 结婚新郎致辞(15篇)  在学习、工作、生活中,说到致辞,大家肯定都不陌生吧,致辞具有能伸能缩,可以...
庆中秋迎国庆联欢晚会主持词(...   (念8条短信)  男:我们的驻外营销健儿发来的每一条祝福都是那么的感人。由于时间关系,我们不能一...
重庆森林经典台词 重庆森林经典台词  《重庆森林》由两个基本不相干的故事构成。两个故事之间的关系,就像擦身而过的金城武...
歌曲奔跑主持词串词 歌曲奔跑主持词串词范文  借鉴诗词和散文诗是主持词的一种写作手法。在如今这个中国,主持成为很多活动不...