java 7bit_JAVA有关位运算的全套梳理

本文深入探讨了Java中位运算的原理,包括原码、反码和补码的概念,以及如何通过补码进行数值计算。详细解释了为何byte类型的取值范围是-128到127。此外,文章还介绍了Java的位运算操作,如与、或、异或、按位取反、左移、有符号右移和无符号右移,并通过实例展示了它们的使用。最后,讨论了位运算在实际项目中的应用,如利用位运算表示多个开关状态,提高存储效率。
摘要由CSDN通过智能技术生成

一、在计算机中数据是如何进行计算的?

1.1:java中的byte型数据取值范围

我们最开始学习java的时候知道,byte类型的数据占了8个bit位,每个位上或0或1,左边第一位表示符号位,符号位如果为1表示负数,为0则表示正数,因此要推算byte的取值范围,只需要让数值位每一位上都等于1即可。

我们来用我们的常规思维来分析下byte类型的取值范围:

cc54d74bd1e196919567188f88f9c140.png

图1

如果按照这种思路来推算,七个1的二进制数转换为十进制是127,算上符号位,取值范围应为:-127~+127,但事实上我们知道,byte的取值范围是-128~127,这里先打个问号,接着往下看。

现在让我们计算下byte类型的7加上byte类型的-2是多少:

67c2163df59b7610fad7da012041cceb.png

图2

诶?跟我们预想的不一样,因为我们是知道7和-2的和应该是5才对,结果应该表示为:00000101,但事实上通过图2的结果来看确实跟预想的不一样,所以计算机在做计算的时候,肯定不是表面上的符号位+数值位的方式进行的计算的。

1.2:原码,反码,补码

我们先来看下定义:

👉 原码定义:符号位加后面的数值,比如图2里的00000111和10000010都是原码,原码比较简单,就是我们在上面单纯理解上的原值。

👉 反码定义:正数的反码就是它的原码,负数的反码符号位不变,其余数值位全部按位取反,例如:

00000111的反码:00000111

10000010的反码:11111101

👉 补码定义:同样的,正数的补码仍然等于它的原码本身,负数的补码等于它自己的反码+1,例如:

00000111的补码:00000111

10000010的补码:11111110

🌴 总结:正数的原码、反码、补码完全一致,负数的反码等于它原码的数值位按位取反,负数的补码等于它的反码+1

现在让我们用反码的方式来计算下图2中的式子:

8b485794a35d744e68442653e6784733.png

图3

利用数值的反码计算出的结果已经很接近正确答案了,+4的反码等于它的原码,现在只需要让它+1就是正确答案,还记得补码的定义吗?负数的补码等于它的反码+1,那现在让我们用补码做下计算试试?

e28e17cd71deefcbbb87df57a505d6db.png

图4

ok,我们发现,用它们的补码做加法,得到的数值就是我们想要的正确答案,事实上,计算机并没有减法运算器,所有的减法运算,都是以一个正数加上一个负数的形式来交给加法运算器计算的,由于负数的符号位为1,虽然我们人是知道它的含义,但是作为计算机,它是不知道第一位是符号位的,它要做的就仅仅是让两个数相加而已,正是因为如此,我们才

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值