2.2.2 定点数的移位运算

 XYXZNB(*^ワ^*)*\(^o^)/*

我们已经知道了定点数在计算机内部如何表示分为无符号数和有符号数啊,其中有负号数可以用元码补码,反码和移码这样的4种方式来表示,那么从这个小节开始,我们要学习定点数的相关的运算,应该怎么实现分为移位运算,还有加法减法运算,乘法运算,除法运算,其中一位运算和加减运算的考察频率是更高的,那这一小节中我们先来学习定点数的一倍运算,怎么实现那移位运算,又可以进一步的划分为算术移位,逻辑移位,还有循环移位,我们会按从上至下的顺序依次讲解,好,那首先来认识一下什么叫做算术移位,我们从大家熟悉的十进制数出发啊,假设这儿有这样的一个10进制数985.211,那么我们从小经常做的一个事情是让小数点后移一位或者后移两位相当于整个数值也就是几十到二十八小时。次方也就是奇数的一次方,小数点后移两位,相当于乘以10的二次方,那小数点往前移也是类似的一个效果,只不过往前移的话,那相当于是除以10的一次方和除以10的二次方,这是大家在小学的时候就学会的东西,那如果结合我们之前对R进制数它的实际数值的一个定义来看的话,其实我们移动了小数点之后,相当于改变了每一个数码位的位权,因为每一个位的位权为多少,其实是以小数点的位置作为参考的。所以所谓的算术移位,算术移位的意思就是我们通过改变各个数码位和小数点的这种相对位置,从而改变各个数码位的位权,那我们可以用这种算术移位的方式来等价的实现乘法和除法,这是大家熟悉的实际值,那对于我们之前的小节中学习到二进制数其实也是一样的,对于定点数来说我们没办法改变小数点的位置,但是山不转。对于定点数来说我们没办法改变小数点的位置,但是山不转可以让水转,所以我们如果能够移动这个数值部分,只要能改变每一个数值位和小数点的相对位置关系,那我们同样可以实现算术移位的运算,比如这我们已经有了-20这个数的原码,表示好来看一下进行了算术又移又移了移位之后,啊,得到的这个值应该是2的一次方,再加上23次方也就是等于10,那么在考虑上这个符号位就应该是-10这样的一个值,所以和我们之前实际是推出的结论是类似的,当我们对二进制的这种定点数右移移位之后,相当于我们实现了除以基数的一次方,这样的一个操作,那结合这个图并不难理解,本来以前这两个一它们的权重分别是2的4次方和2的二次方,那右移一位之后,它们的权重都分别除以了2,一个变成二的三次方,一个变成2的一次方,整体都是这样缩小了一半。 R的三次方,一个变成R的一次方,整体都是这样缩小了一半,所以这就是算术右移的一个效果,相当于除以2,好我们再用一位,那么刚才这个最低位就会移动到啊,小数点的后面这个位置,由于我们的机器字长有限,所以移出去的这一位我们就只能舍弃不用,那同样的新的这个高位我们会用0来补充,那这次右移的结果,同样也是相当于再除以一个2,好继续在这个基础上我们再右移一位,那这个时候我们会把末位的一给移出啊,这8个比特的范围同样高位补0,不过这个时候得到的值啊,它应该是-2这样的一个值,已经不是-5÷2的精确表示了,因为-5÷2应该是负的2.5,这样才是精确的除以2的值,那这是因为我们移出去的这一位,它的值不是0而是1其实相当于我们舍弃了一个进度因此得到这样的结论当我们进行算术一的时候首先高位。算术右移的时候,首先高位会用0来补充,然后低位直接舍弃,如果我们舍弃的这一位是0的话,那么就相当于严谨的除以2的一个结果,而如果我们舍弃的这一位不等于0,那在这种情况下我们会丢失一定的精度好,这是算术又一接下来来看算术左移,那左移的方式也是一样的,我们只让这个数值部分进行移动符号位是保持不变的,那进行左移之后,原本数值位的最高位会被我们舍弃,而最低位出现的这些空位,我们会用零来代替,那进行这样的一次右移之后得到的结果应该是负的40相当于在原有的基础下乘以2,那如果再做一位也是类似的效果,我们丢弃最高倍的林湘,当于在原有的基础上再乘以一个2,而我们在做第1位,由于这次我们丢掉的最高位,他是1,所以最终我们得到的结果是等于负的32就不是这样。这么简单了,这点其实也很好理解,因为我们原本左移两位的时候,这个数值就已经到了负的80这样的一个值,那负的80,如果让它再乘以2,应该是负的160这么多,而这个地方我们原码的尾数只有7位,7个比特位只能表示0~127这样的一个绝对值的范围,所以160肯定是已经超出7个比特贝能够表示的范围,那这种情况下我们丢弃最高位的一拳值最高的那个一被我们丢弃了,当然就会出现这种严重的误差,他们这是对原码的算术作业需要注意的地方,好的,那目前为止我们探讨的啊,算数左翼和算术,右一是基于用原码表示的定点整数来探讨的,那如果不是定点整数而是定点小数,其实也是一样的道理,一样的效果当我们进行算术左移的时候,同样相当于×2的一个效果算术右移,相当于除以2的一个效果所有的这些他们的味全在做。1他们的位权在左移和右移的时候分别会乘以2和除以2好,所以定点小数,我们就不再单独的探讨好,那接下来我们再反基于反马的算术移位这儿我们已经给出了正20和-20的一个原码表示那由于正数的反码表示和原码表示是一模一样的,所以对于正数的算术移位,不管是左翼还是右翼处理的方法都适合源码一样啊,这是反码表示的正数啊,需要采取的一个策略和源码是一样的好再来看复数也就是符号V为1的数这种数的反马尾数部分和源码是完全相反的,一变成00会变成一砝码的,一相当于源码的零砝码的,0相当于源码的1,所以对负数的算术移位,我们进行补位的时候需要注意,我们补的都是伊娜,这是对于反码的算术移位,正数和负数我们需要补充的这个味是不一样的,好接下来我们再来看补码的算术移位。补充的这个味是不一样的,好,接下来我们再来看无码的算术移位,那由于正数的补码表示和源码也是一样的,所以对于正数补码的移位运算,我们同样和源码保持一样的策略就可以都是需要用云来补充移动之后出现了空位,而负数补满的一位会相对来说复杂一些,补码是从反马的基础上末位嘉羿得到的,那反马的末位加一会导致砝码当中更靠后的这些一都会变成0,并且都会发生进位,直到进到第1个0这个地方的位置,所以砝码转补码有这样的一个规律,就是从砝码的最右边这一位开始,从右往左依次的取法,把1都变成0,直到碰到第1个0为止,把砝码的第1个0变成1之后,再往前的这些部分就不用再改变了,所以负数的补码呈现出了这样的一个规律,在这个补码最右边的一个1,还有这个一这些部分这些。一个一还有这个一你用的这些部分,这些部分是和源码保持一致的,而最右边的这个一左边的这些部分,这些部分又是和砝码保持一致的,所以当我们对补码的这些尾数进行算术右移的时候往右移会导致高位出现一个空位,那我们补这个空位的方法应该是和反码的啊,补空位规则是保持一致的,也就是补一,而当我们对补码进行算术左移的时候,最低位会出现一个需要补的空位,那由于补码的后半部分和源码是相同的,所以我们在补这个空位的时候应该补0,因此我们得到结论,对于负数补码的算术移位,当右移的时候我们应该补一,然后低位审计刚进行算术左移的时候应该低位补0,然后高位舍弃我们就保证the相当于除以2的一个效果,算术左移相当于×2的一个效果好的,那我们在对算术移位进行一个小小的总结,对于正数来说由于原码补码反码啊,他们的正数表示都是一样的,所以我们需要补位的时候都是用银趣步,而对于负数来说补码的负数左1的时候需要填,0右1的时候是要添一而砝码的复数,不管左一还是右1,我们都是要添一。不管左移还是右移,我们都是要添1那只要遵从这儿给出的规定,无论我们使用的是什么呢,只要我们进行的是算术左移就相当于×2,主要是右移就相当于除以2,只不过由于我们机器自成呃位数有限,所以有的时候我们没办法用算术一位精确的来等效乘除法,这一点我们再讲源码的左移和右移的时候特别的强调过好,接下来用一个简单的例子让大家体会一下算术移位的一个呃具体的应用。接下来我们再来看第2种,一位叫做逻辑移位,那逻辑移位的规则很简单啊,当我们右移的时候高位50,然后低位移出的这一位直接舍弃就可以,左1的时候我们在低位补灵,然后移出的这一位,我们直接手机就可以那逻辑移位的,这种规则我们可以把它看作是对无符号数的算术移位,好,这个规则很简单,那我们来看一下逻辑移位有什么作用,比如说啊,我们在计算机里面表示一种颜色的时候,经常会使用到这样的一种表示方式叫做RGB那R指的是right,也就是红色G表示的是green也就是绿色,而B表示的是鹿也就是蓝色,因为我们知道自然界里面所有的颜色都是由红绿蓝这三种三原色来按照一定的配比来组成的,比如对于最后这个颜色啊,它的RGB值就分别是102幺三九幺三九一个像素。那有的时候我们存储一个像素点,它的RGB值的时候,需要把RGB这三个值把它们连成三个字节的一个整体第1个字节存放R,第2个字节存放距第3个字节存放B的值,而现在我们只是分开指明了这三个部分的值分别是多少,好那来看一下怎么把它们拼成三个字节的一个整体可以这么做,首先我们啊申请用三个字节来存储无符号数102也就是R的值,那现在我们对这个无符号数进行逻辑左移左移16位,这就会导致第8位移动到高8位的位置,然后左移产生的这些空位,我们都是用灵来补充,这是逻辑左移的一个规定,而接下来我们再定义一个三个字节的无符号数啊,这个数的值是139,那么我们再对这个无符号数进行逻辑左移8位的操作,就会导致原本的第8位被放到了中间的8个位的位置之后我们再用三个字。的直139好,最后我们再把刚才得到的123这三个部分进行一个家法操作,就可以得到三个字节表示的RGB值,最高的一个字节表示的是2职,中间表示的是G也就是绿色的值,然后最后表示的是B blue的值啊,那这是逻辑移位的一个应用的小粒子,接下来我们再来看最后一种移位运算叫做循环移位啊,顾名思义,所谓循环就是指当我们进行比如说循。这一位的一个应用的小例子,接下来我们再来看,最后一组一位运算叫做循环移位啊,顾名思义,所谓循环就是指当我们进行,比如说循环左移的时候移出来的这一位会被放到我们需要填补的这个空位在移位的时候整个二进制串是进行循环补位的,这个应该很好理解,那当我们进行循环右移的时候,是不是也是类似的,从右边移出来的这一位又会跑到啊应该补充的那个位置去啊,那还有一种比较特殊的循环移位,就是在近卫卫的这种情况,先来解释一下什么叫近卫卫,也就照我们标注的CF这一位进位的概念大家都知道了,比如我们对两个8位的二进制数进行加法操作,那当我们运算到最高位的时候,1+1是=0,往高位进1,但是由于机器资产有限,寄存器里只能保存8个二进制位确实产生了一个金币因此为了实现超过八比特的这种数据确实产生了一个金币因此为了实现超过八比特的这种数据的。超过巴比特的这种呃数据的加法计算机硬件里面会包含这样的所谓的进位的位来记录一下之前这些低位的运算有没有产生进位,把这个进位保留下来之后,我们在进行之后的更高自己的运算的时候,就可以得到正确的结果,0+1,再加上刚才保留的这个进位1,然后用这样的方式我们就可以不断的往高位啊进行计算好,所以这就是所谓的进位位的一个作用,总之它里面要么存在一个1,要么存了一个0,好,现在当我们考虑上这个进位之后,再进行循环左移,产生的效果就是这样的,就是会把原本数值位的最高位把它放到这个进位位这个地方,而原本的这个进位位会来补充出现了空位这个样子好,这就是带进位位的循环左移那带进位位的。那带进位位的循环右移是不是也是类似的?呃,无非就是把末尾的这个低位放到进位位的位置,而原本的进位原本的进位位,把它放到啊最高位出现空缺的这个位置,噢,那这就是所谓的循环移位,那循环移位的操作很适合用于把一个数据的高字节和低字节进行一个调换,就比如之前我们讲过一个例子啊,这个汉字它需要占两个字节的啊这个位置,但是我们可以有大端存储和小端存储这样的两种方式大端存储就是先存放高字节再存放低字节,而小端存储是先存放B字节再存放高字节,那如果说要在大端存储和小端存储之间进行转换,使用循环移位是不是就很方便?我们可以循环右移8位或者循环左移8倍,就可以实现高低字节的一个调换 We的一个作用我们学习的一位运算其中最长好的是算数的。我们学习了定点数的移位运算,其中最常考的是算术移位啊,当我们进行算术左移移位的时候,相当于成了一个基数,当我们算术右移移位的时候,相当于除以奇数的效果,那原码砝码补码进行移位之后补位的这个策略是不太一样的,特别是补满,大家比较容易忘,需要基于理解来记忆,那么逻辑,一味的实现很简单,无论是左一还是左,一还是右一都补您就可以,之后我们又学习了循环移位就是用移出去的未来补上空缺的那个位儿,对于带镜柜位的循环移位,就是移出地为我们会把它放到近卫卫的位置,而原来的精神病会补上空缺的那个位置。就是移出地为我们会把它放到近卫卫的位置,而原来的近卫卫会补上空缺的那个位置,那再次强调由于原码补码反码,他们的为数有限,也就是可以表示的数值范围是有限的,所以在某些情况下,一味并不能精确的等效乘法和除法的一个效果可能会丧失精度,甚至是产生比较大的误差,好的,那这就是移位操作相关的所有内容。

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值