算术移位 VS 逻辑移位
定义
逻辑左移(LLS,Logical Left Shift):低位补零。
逻辑右移(LRS,Logical Right Shift):高位补零。算术左移(ALS,Arithmetic Left Shift):符号位不变,低位补零。
算术右移(ARS,Arithmetic Right Shift):高位补符号位。注意:以上4种定义,所有位(包括符号位)要同步移动。
结论
1. 逻辑左移与算术左移完全相同。
2. 正数:逻辑右移与算术右移完全相同。
3. 负数:逻辑右移与算术右移不同。
以上结论从严格从定义上得到。接下来解释一下多数人的疑惑。
疑惑
1. 负数的逻辑左移,明显符号位被移走了,1变成0了呀,负数不就变成正数了吗?为何能和算术左移一样呢?
首先呢,从定义上看,逻辑左移和算术左移就是一样的,这个问题准确来讲是问为什么这么定义?
其实这是一个常见的误区。我们要注意,计算机是按补码
存储的。
假设计算机的位长是4
位,1111b
(b
表示二进制)这个数是几?这个数的实际大小应该是保持符号位不变,其他位取反再加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...1b
11 00...0b
11 11...1b
- 第一段 [-2n-1, -(2n-2+1)] 对应次高位为0的情况:
此时左移1位(即乘以2),符号位反转,但是数值上恰好都溢出了。 - 第二段 [-2n-2, -1] 对应次高位为1的情况:
此时左移1位(即乘以2),符号位不变,数值上也不会溢出。
结论:次高位为1时,逻辑左移不会改变符号;次高位为0时,逻辑左移数值上一定会溢出,此时已经没有意义。综上,逻辑左移与算术左移相同。
算术移位 VS 逻辑移位相关推荐
- 算术移位和逻辑移位详解
大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高. 移位运算是将数值向左向右移动,对于十进制来说就是实现放大十倍和缩小十倍的效果,而对于二进制而言就是放大两倍和缩小两倍的效果 ...
- 算术移位和逻辑移位的区别
1. 算术移位与逻辑移位 : 算术移位指令对带符号数进行移位. 逻辑移位指令对无符号数进行移位.算术左移.右移,逻辑左移.右移 的图示如下 : 这里有一个进位位C,它就是标志寄存器 (即状态寄存器, ...
- 逻辑移位和算术移位的区别
逻辑移位 逻辑移位是指逻辑左移和逻辑右移,移出的空位都用0来补. 算术移位 算术移位 就需要分有符号型值和无符号型值 对于无符号型值,算术移位等同于逻辑移位. 而对于有符号型值 ,算术左移等同于逻辑左 ...
- Verilog专题(十六)移位寄存器(逻辑移位、算术移位、循环移位)
HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 1.逻辑移位寄存器 题目 Build a 4-bit shift register (right ...
- 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...
- [计算机组成原理]2-6、算数移位、逻辑移位、循环移位
逻辑移位 看笔记一定要心静,慢慢来不急. 在移位运算中,考察最频繁的就是算术移位和逻辑移位,逻辑移位相对来说比较简单,我们先从它入手. 首先我们来看什么叫移位,移位就是移动位置,移动数据的位置,也就是 ...
- 计算机中逻辑移位示意图,定点数运算之移位运算(收藏)
一.移位运算 1.移位的意义 移位运算在日常生活中常见.例如15米可写作1500厘米,单就数字而言,1500相当于小数点左移了两位,并在小数点前面添了两个0:同样15也相当于1500相对于小数点右移了 ...
- pushpop指令的操作数必须是字操作数_指令格式
按指令字长度分类 指令字长:整个指令的长度,与机器字长没有固定关系.通常把指令字长 = 机器字长的指令称为单字长指令,同理还有半字长指令和双字长指令. 在一个指令系统(指令集:ARM,x86)中,若所 ...
- 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...
计算机组成原理 - 定点整数的原码补码运算(待验证) 目录 〇.环境 对象 运算 定点整数原码.定点整数补码 移位.加.减.乘.除 原码定义: \(x=\begin{cases} x &0\l ...
最新文章
- 浅谈 Nginx与PHP 交互
- Python高级特性: 函数编程 lambda, filter,map,reduce
- 为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
- 【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )
- Linux/unix 查看端口占用
- 详解proxy_pass、upstream与resolver
- Linux 下挂载新硬盘方法(转)
- web前端之js快速入门(ECMAscript)
- 苹果原生NSURLSession的上传和下载
- 阅读SSM项目之scm【第一篇】
- PyQt4打包exe文件
- 数据库in和exist区别
- alpine日志中文乱码的问题解决方案
- 从游戏中学习产品设计04:成就篇
- 4.1.14 Flink-流处理框架-Flink流处理API之数据重分区操作
- Widows Tips
- 《挚爱》简谱,网上没找到,自己写了个,非专业,敬请指教!
- 清华大学公开课线性代数2——第12讲:复数与复矩阵
- 【NVMe2.0b 9】控制器初始化过程
- 2018铁三测评题write以及一些想送给你们的话
热门文章
- 极客日报:曝OPPO给离职员工补发年终奖,此前遭克扣;7 亿条领英用户数据被出售;Android Studio 4.2.2 发布
- Karen Keegans加盟罗克韦尔自动化任人力资源高级副总裁
- 通过命令运行jar包(指定外部依赖jar包)
- 学C语言,C++是自学好还是去培训机构?
- Minecraft 1.12.2模组开发(四十三) 自定义盾牌(Shield)
- Android渲染优化之卡顿检测、统计fps
- 《图解密码技术》笔记5:公钥密码-用公钥加密,用私钥解密
- 通过拼音模糊搜索汉字的功能实现
- Unity 环境搭建
- 将N阶矩阵M置成单位阵