定义

逻辑左移(LLS,Logical Left Shift):低位补零。
逻辑右移(LRS,Logical Right Shift):高位补零。算术左移(ALS,Arithmetic Left Shift):符号位不变,低位补零。
算术右移(ARS,Arithmetic Right Shift):高位补符号位。注意:以上4种定义,所有位(包括符号位)要同步移动。

结论

1. 逻辑左移与算术左移完全相同。
2. 正数:逻辑右移与算术右移完全相同。
3. 负数:逻辑右移与算术右移不同。

以上结论从严格从定义上得到。接下来解释一下多数人的疑惑。

疑惑

1. 负数的逻辑左移,明显符号位被移走了,1变成0了呀,负数不就变成正数了吗?为何能和算术左移一样呢?

首先呢,从定义上看,逻辑左移和算术左移就是一样的,这个问题准确来讲是问为什么这么定义?

其实这是一个常见的误区。我们要注意,计算机是按补码存储的。

假设计算机的位长是4位,1111bb表示二进制)这个数是几?这个数的实际大小应该是保持符号位不变,其他位取反再加1,那么这个数是-1

计算机位长4 bit能表示的数值范围为-8 ~ 7,即1000b ~ 0111b,我们只看负数部分:

原值 左移1位
十进制 二级制 二级制 十进制 说明
-1 1111 1110 -2 扩大2倍
-2 1110 1100 -4 扩大2倍
-3 1101 1010 -6 扩大2倍
-4 1100 1000 -8 扩大2倍
-5 1011 0110 6 溢出,undifined
-6 1010 0100 4 溢出,undifined
-7 1001 0010 2 溢出,undifined
-8 1000 0000 0 溢出,undifined

我们看到,从-5开始,左移1位,全部会溢出。从数值上来看,-5左移1位,应该扩大2倍至-10,但是-10显然超出了4 bit字长计算机的表示范围,也就是溢出溢出的结果当然是不确定的,不可信。即使你保持符号位不变,4 bit也无法表示出-10

思考一下,使得我们疑惑的,无非是:次高位如果为0(也就是上表的-5 ~ -8 这些数)左移1位之后会出现符号反转,,非常奇妙的是,这些数左移1位之后恰好全部溢出

这是巧合吗?

假设计算机位长n bit,那么可表示的负数范围为 -2n-1~ -1 。

如图,将[-2n-1, -1]分成连续的两段:

  └─────────────┘   └───────────┘
 -2n-1      -(2n-2+1)  -2n-2       -1
10 00...0b   10 11...1b11 00...0b11 11...1b

  • 第一段 [-2n-1, -(2n-2+1)] 对应次高位为0的情况:
    此时左移1位(即乘以2),符号位反转,但是数值上恰好都溢出了。
  • 第二段 [-2n-2, -1] 对应次高位为1的情况:
    此时左移1位(即乘以2),符号位不变,数值上也不会溢出。

结论:次高位为1时,逻辑左移不会改变符号;次高位为0时,逻辑左移数值上一定会溢出,此时已经没有意义。综上,逻辑左移与算术左移相同。

算术移位 VS 逻辑移位相关推荐

  1. 算术移位和逻辑移位详解

    大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高. 移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果 ...

  2. 算术移位和逻辑移位的区别

    1.  算术移位与逻辑移位 : 算术移位指令对带符号数进行移位. 逻辑移位指令对无符号数进行移位.算术左移.右移,逻辑左移.右移 的图示如下 : 这里有一个进位位C,它就是标志寄存器 (即状态寄存器, ...

  3. 逻辑移位和算术移位的区别

    逻辑移位 逻辑移位是指逻辑左移和逻辑右移,移出的空位都用0来补. 算术移位 算术移位 就需要分有符号型值和无符号型值 对于无符号型值,算术移位等同于逻辑移位. 而对于有符号型值 ,算术左移等同于逻辑左 ...

  4. Verilog专题(十六)移位寄存器(逻辑移位、算术移位、循环移位)

    ​HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 1.逻辑移位寄存器 题目 Build a 4-bit shift register (right ...

  5. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  6. [计算机组成原理]2-6、算数移位、逻辑移位、循环移位

    逻辑移位 看笔记一定要心静,慢慢来不急. 在移位运算中,考察最频繁的就是算术移位和逻辑移位,逻辑移位相对来说比较简单,我们先从它入手. 首先我们来看什么叫移位,移位就是移动位置,移动数据的位置,也就是 ...

  7. 计算机中逻辑移位示意图,定点数运算之移位运算(收藏)

    一.移位运算 1.移位的意义 移位运算在日常生活中常见.例如15米可写作1500厘米,单就数字而言,1500相当于小数点左移了两位,并在小数点前面添了两个0:同样15也相当于1500相对于小数点右移了 ...

  8. pushpop指令的操作数必须是字操作数_指令格式

    按指令字长度分类 指令字长:整个指令的长度,与机器字长没有固定关系.通常把指令字长 = 机器字长的指令称为单字长指令,同理还有半字长指令和双字长指令. 在一个指令系统(指令集:ARM,x86)中,若所 ...

  9. 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...

    计算机组成原理 - 定点整数的原码补码运算(待验证) 目录 〇.环境 对象 运算 定点整数原码.定点整数补码 移位.加.减.乘.除 原码定义: \(x=\begin{cases} x &0\l ...

最新文章

  1. 浅谈 Nginx与PHP 交互
  2. Python高级特性: 函数编程 lambda, filter,map,reduce
  3. 为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
  4. 【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )
  5. Linux/unix 查看端口占用
  6. 详解proxy_pass、upstream与resolver
  7. Linux 下挂载新硬盘方法(转)
  8. web前端之js快速入门(ECMAscript)
  9. 苹果原生NSURLSession的上传和下载
  10. 阅读SSM项目之scm【第一篇】
  11. PyQt4打包exe文件
  12. 数据库in和exist区别
  13. alpine日志中文乱码的问题解决方案
  14. 从游戏中学习产品设计04:成就篇
  15. 4.1.14 Flink-流处理框架-Flink流处理API之数据重分区操作
  16. Widows Tips
  17. 《挚爱》简谱,网上没找到,自己写了个,非专业,敬请指教!
  18. 清华大学公开课线性代数2——第12讲:复数与复矩阵
  19. 【NVMe2.0b 9】控制器初始化过程
  20. 2018铁三测评题write以及一些想送给你们的话

热门文章

  1. 极客日报:曝OPPO给离职员工补发年终奖,此前遭克扣;7 亿条领英用户数据被出售;Android Studio 4.2.2 发布
  2. Karen Keegans加盟罗克韦尔自动化任人力资源高级副总裁
  3. 通过命令运行jar包(指定外部依赖jar包)
  4. 学C语言,C++是自学好还是去培训机构?
  5. Minecraft 1.12.2模组开发(四十三) 自定义盾牌(Shield)
  6. Android渲染优化之卡顿检测、统计fps
  7. 《图解密码技术》笔记5:公钥密码-用公钥加密,用私钥解密
  8. 通过拼音模糊搜索汉字的功能实现
  9. Unity 环境搭建
  10. 将N阶矩阵M置成单位阵