当前位置:网站首页 > 技术博客 > 正文

移位指令应用实例



看笔记一定要心静,慢慢来不急。


在移位运算中,考察最频繁的就是算术移位和逻辑移位,逻辑移位相对来说比较简单,我们先从它入手。

首先我们来看什么叫移位,移位就是移动位置,移动数据的位置,也就是说移位运算的操作对象是数据

根据移位的方向不同,我们可以把逻辑移位分为逻辑左移逻辑右移
在这里插入图片描述

逻辑左移:高位舍弃,低位补0。

逻辑右移:低位舍弃,高位补0。

不知道大家有没有发现这里我们并没有提及符号位,因为逻辑移位可以将其认为是无符号数的移位,算数移位才会去关心符号是正式负。


上面提到算数移位是关于有符号数的移位,那么提到有符号数,我们就应该想到它的表示形式有原码、反码和补码。有的人可能会好奇,欸不是还有移码嘛?欸移码不会就是移位之后得到的吧?不是这样的啊,移码它跟移位运算没有丝毫关系啊,移码只是方便计算机对数据的大小进行比较而产生的。

1. 原码移位

算数移位和逻辑移位的不同就在于算数移位更在意数据移位后的数值变化,也正是因此可以将一些运算用算数移位来代替。我们先来看一个引例:
在这里插入图片描述

在十进制条件下,我们可以看到数据左移相当于数据✖10;数据右移相当于数据➗10.

我们可以类比猜想,那二进制的一位会不会是✖2;和➗2呢?我们来看下面的例题,这是定点整数的算数移位,可以发现只要舍弃的数值不是1那么左移就是×2;右移就是÷2.

例:
在这里插入图片描述

算数移位的符号位都保持不变,仅对数值位进行移位。

左移:高位舍弃,低位补0。若舍弃的值为1,会产生严重误差。

右移:低位舍弃,高位补0。若舍弃的值为1,会丢失精度。

定点小数规则相同。


2.反码移位

提到反码,我们就应该想到反码和原码的关系。正数的原码和反码相同,负数的原码和反码相反。

所以正数反码(与原码相同):

左移:高位舍弃,低位补0。

右移:低位舍弃,高位补0。

负数反码:

左移:高位舍弃,低位补1。

右移:低位舍弃,高位补1。


3.补码移位

同理,正数补码和正数也相同那么移位规则也一样。负数的补码移位就有点特殊了,我们先来看
在这里插入图片描述

如上图所示,补码这个东西不仅和原码有关系,和反码也有关系,观察所有补码可以发现规律,补码从低位开始直到出现第一个1(红框内)和原码相同;其余(篮框内)和反码相同。

由此规律我们可以得到负数补码移位:

左移:高位舍弃,低位补0。

右移:低位舍弃,高位补1。


4.总结

在这里插入图片描述

以上我们可以看的出来,算数移位还是挺复杂的,但是其实你只要记住原码的左移右移就行了,因为其余的可以根据他们与原码的关系联想出来,

比如正数原码、反码和补码都是一样的所以移位规则也一样。负数反码和原码是相反的关系,所以原码补0,反码就补1.

负数的反码左边和反码相同,右边和原码相同,左移右边出现空位那就和原码相同补0,右移左边出现空位就和反码相同补1.

仔细思考一下,急躁是没有用的,要不就直接记住上表规则会用就行,理解更好。


其实看这个名称大家估计就有一个半信半疑猜想了。循环嘛,就是转圈呗。

确实,循环移位特点就是不舍弃
在这里插入图片描述

如上图,循环左移。循环右移同理理解。

循环移位还有一种是带进位位的循环移位,说白了也就是多了一位用作中转。如下图:
在这里插入图片描述


至此移位操作就这么多了,好好理解着记忆这样记忆的时间更久不容易搞混。加油!

在这里插入图片描述

版权声明


相关文章:

  • java在线编程工具2024-11-23 23:30:02
  • eof函数用法2024-11-23 23:30:02
  • 溢出显示2024-11-23 23:30:02
  • qt qfile写文件2024-11-23 23:30:02
  • js注释有什么作用2024-11-23 23:30:02
  • chroot原理深入剖析2024-11-23 23:30:02
  • 线程死锁的四个必要条件2024-11-23 23:30:02
  • malloc函数的格式2024-11-23 23:30:02
  • 三态与非门的三种状态2024-11-23 23:30:02
  • php8 opcache2024-11-23 23:30:02