关于二进制

本文深入解析二进制数的概念及其在计算机底层数据传输中的应用,探讨了二进制数与十进制数的转换,以及二进制加减乘除的运算规则。特别介绍了二进制补数表示法,用于解决负数表示问题,并详细解释了算数右移和逻辑右移的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章还是转载的

我们都知道,计算机的底层都是使用二进制数据进行数据流传输的,那么为什么会使用二进制表示计算机呢?或者说,什么是二进制数呢?再拓展一步,如何使用二进制进行加减乘除?

什么是二进制数

那么什么是二进制数呢?为了说明这个问题,我们先把00100111这个数转换为十进制数看一下,二进制数转换为十进制数,直接将各位置上的值*位权即可,那么我们将上面的数值进行转换

也就是说,二进制数代表的00100111转换成十进制就是39,这个39并不是39两个数字连着写,而是3*10+9*1,这里面的101就是位权,以此类推,上述例子中的位权从高位到低位依次就是76543210。这个位权也叫做次幂,那么最高位就是27次幂,26次幂等等。二进制数的运算每次都会以2为底,这个2指得就是基数,那么十进制数的基数也就是10。在任何情况下位权的值都是数的位数-1,那么第一位的位权就是1-1=0,第二位的位权就睡2-1=1,以此类推。

那么我们所说的二进制数其实就是用01两个数字来表示的数,它的基数为2,它的数值就是每个数的位数*位权再求和得到的结果,我们一般来说数值指的就是十进制数,那么它的数值就是3*10+9*1=39

移位运算和乘除的关系

在了解过二进制之后,下面我们来看一下二进制的运算,和十进制数一样,加减乘除也适用于二进制数,只要注意逢2进位即可。二进制数的运算,也是计算机程序所特有的运算,因此了解二进制的运算是必须要掌握的。

首先我们来介绍移位运算,移位运算是指将二进制的数值的各个位置上的元素坐左移和右移操作,见下图

补数

刚才我们没有介绍右移的情况,是因为右移之后空出来的高位数值,有01两种形式。要想区分什么时候补0什么时候补1,首先就需要掌握二进制数表示负数的方法。

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。符号位是0时表示正数,是1时表示负数。那么-1用二进制数该如何表示呢?可能很多人会这么认为:因为1的二进制数是00000001,最高位是符号位,所以正确的表示-1应该是10000001,但是这个答案真的对吗?

计算机世界中是没有减法的,计算机在做减法的时候其实就是在做加法,也就是用加法来实现的减法运算。比如100-50,其实计算机来看的时候应该是100+(-50),为此,在表示负数的时候就要用到二进制补数补数就是用正数来表示的负数

为了获得补数,我们需要将二进制的各数位的数值全部取反,然后再将结果+1即可,先记住这个结论,下面我们来演示一下。

具体来说,就是需要先获取某个数值的二进制数,然后对二进制数的每一位做取反操作(0--->11--->0),最后再对取反后的数+1,这样就完成了补数的获取。

补数的获取,虽然直观上不易理解,但是逻辑上却非常严谨,比如我们来看一下1-1的这个过程,我们先用上面的这个10000001(它是1的补数,不知道的请看上文,正确性先不管,只是用来做一下计算)来表示一下

奇怪,1-1会变成130,而不是0,所以可以得出结论10000001表示-1是完全错误的。

那么正确的该如何表示呢?其实我们上面已经给出结果了,那就是11111111,来论证一下它的正确性

我们可以看到1-1其实实际上就是1+(-1),对-1进行上面的取反+1后变为11111111,然后与1进行加法运算,得到的结果是九位的100000000,结果发生了溢出,计算机会直接忽略掉溢出位,也就是直接抛掉最高位1,变为00000000。也就是0,结果正确,所以11111111表示的就是-1

所以负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二进制数各位取反,然后将结果+1

算数右移和逻辑右移的区别

在了解完补数后,我们重新考虑一下右移这个议题,右移在移位后空出来的最高位有两种情况01

将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前符号位的值(01)。这就被称为算数右移。如果数值使用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确的表示1/21/41/8等的数值运算。如果是正数,那么直接在空出来的位置补0即可。

下面来看一个右移的例子。将-4右移两位,来各自看一下移位示意图

如上图所示,在逻辑右移的情况下,-4右移两位会变成63,显然不是它的1/4,所以不能使用逻辑右移,那么算数右移的情况下,右移两位会变为-1,显然是它的1/4,故而采用算数右移。

那么我们可以得出来一个结论:左移时,无论是图形还是数值,移位后,只需要将低位补0即可;右移时,需要根据情况判断是逻辑右移还是算数右移。

下面介绍一下符号扩展:将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位数的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差。

8位二进制为例,符号扩展就是指在保持值不变的前提下将其转换成为16位和32位的二进制数。将01111111这个正的8位二进制数转换成为16位二进制数时,很容易就能够得出0000000001111111这个正确的结果,但是像11111111这样的补数来表示的数值,该如何处理?直接将其表示成为1111111111111111就可以了。也就是说,不管正数还是补数表示的负数,只需要将01填充高位即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值