为什么右移有“有无”符号之别,而左移却没有?

news/2024/7/7 21:29:25

📝 摘要:在众多语言中,都提供了关于位操作符,但 为什么右移有“有无”符号之别,而左移却没有?,本文一步步讲述左移、有符号右移、无符号右移,以此来揭开位移的面纱,最终探究答案,囿于本人知识与能力,如有纰漏,敬请指出!

1. 引言

在 JavaScript 和 Java 语言中,针对二进制进行移位的位操作符有:左移 <<、有符号右移 >>、无符号右移 >>>,首先我们先从概念上去剖析它们,这里引用《计算机组成原理教程》书中的一段描述:

计算机中机器数的字长往往是固定的,当机器数左移 n 位或右移 n 位时,必然会使其 n 位低位或 n 位高位出现空位。那么,对空出的空位应该添补 0 还是 1 呢?这与机器数采用有符号数还是无符号数有关。对无符号数的移位称为逻辑移位,对有符号数的移位称为算术移位。

考虑符号位的位操作都称为算数移位,“算数”,就是用于计算所用;不考虑符号位的都成为逻辑移位,“逻辑”,就是简单的移位,一般用于压缩编码等单纯移位,不需要考虑符号位。以这两个概念作为分类可将移位的位操作符分为:

分类左移右移
算数移位左移<<有符号右移符号>>
逻辑移位无符号右移符号>>>

看完这个分类表,对强迫症来说似乎不那么友好,这也就引出来本博客的题目:为什么右移有“有无”符号之别,而左移却没有?

回答这个问题之前,还是得了解移位操作,为了简化描述,我们以 5 位二进制数(最高位为符号位)来作为举例:

2. 左移

对于数值 3,它的二进制位 00011,左移前可以表示如下:

下标43210
位数00011

左移两位 3 << 2注意符号位不参与移位

下标43210
位数00011

高位舍弃,低位补 0,结果可得 12

下标43210
位数01100

对于 -3,左移前可以表示如下:

下标43210
位数11101

在计算机底层中,负数以补码的形式存储,正数的补码和原码一样,负数的补码由除符号位的原码(该数的绝对值)的反码再加一可得

左移两位 -3 << 2注意符号位不参与移位

下标43210
位数11101

高位舍弃,低位补 0,结果可得 -12(注意结果仍为补码)

下标43210
位数10100

这里结果的计算涉及到原码和补码的转换,可以参考博客:补码和原码的转化过程

3. 有符号右移

为了更好的举例,这里我们使用数值 5,它的二进制位 00101,有符号右移前可以表示如下:

下标43210
位数00101

有符号右移两位5 >> 2注意符号位不参与移位

下标43210
位数00101

高位补符号位,低位舍弃,有符号右移结果为 1

下标43210
位数00001

注意!!!,高位是补符号位,正数补 0,看不出效果,当对于负数来说,却又天壤之别。


对于 -5,有符号右移前可以表示如下:

下标43210
位数11011

有符号右移两位 -5 >> 2注意符号位不参与移位

下标43210
位数11011

高位补符号位,低位舍弃,结果为 -2

下标43210
位数11110

4. 无符号右移

无符号右移把整个数当作无符号数来看待,再进行移动

对于 5,无符号右移前可以表示如下:

下标43210
位数00101

无符号右移两位 5 >>> 2

下标43210
位数00101

高位补 0,低位舍弃,无符号右移结果为 1

下标43210
位数00001

对于 -5,无符号右移前可以表示如下:

下标43210
位数11011

无符号右移两位 -5 >>> 2,注意,此时将整个数当作无符号数来看待

下标43210
位数11011

高位补 0,低位舍弃,此时结果变为正数 6

下标43210
位数00110

5. 总结

  1. 我们可以看到,对于正数,有符号右移和无符号右移都是一样的,但是对于负数,且大相径庭,原值 -5,无符号右移后变成了 6
  2. 我们再以宏观的视角去对比完左移和右移,就会发现,右移后高位是空出来的,对于空出来的高位,就需要去考虑补 0 还是补 1,而左移后高位时被舍弃掉的,根本不需要“补位”一说。这也就解释了为什么右移有“有无”符号之别,而左移却没有,因为根本就没有必要。

6. 参考资料

[1] 千万别小看这些运算符背后的逻辑:
https://developer.aliyun.com/article/763951:
[2] 补码和原码的转化过程:https://www.cnblogs.com/wxf0701/archive/2008/08/14/1267639.html


http://lihuaxi.xjx100.cn/news/18485.html

相关文章

echarts-饼图和 模拟事件补充

饼图的数据是由 name 和 value 组成的数组 饼图无须配置 xAxis 和 yAxis let ddaa [{name:CPU&#xff1a;i3-12100F,value:799},{name:主板&#xff1a;华硕B660M,value:519},{name:显示器&#xff1a;AOC-27G2,value:1299},{name:显卡&#xff1a;RX5500,value:1399},{name:…

尚硅谷kubernates学习笔记 1

文章目录1 概念1.1 组件1.2 插件1.3 术语1.4 Pod类型1.4.1 RS1.4.2 Deployment1.4.3 DaemonSet1.4.4 Job & CronJob1.5 service服务发现1.5.1 ipvs代理模式1.5.2 Service实验1.5.3 Ingress1.6 网络空间1.7 资源1.8 容器生命周期1.8.1 容器hook1.8.2 Pod状态含义1 概念 k8s…

Scratch软件编程等级考试一级——20200319

Scratch软件编程等级考试一级——20200319理论单选题判断题实操小鸡与小鸭字母AB点头问好理论 单选题 1、下面哪个积木能够调节左右声道的音量&#xff1f;&#xff08;&#xff09; 2、当我们进行数学计算时&#xff0c;需要用到下面哪个模块中的积木&#xff1f;&#xff0…

认证涉密资质过程中-保密室建设要求有哪些?

一保密室建设要求主要分为三类 1.人防&#xff1a;涉密人员培训。 2.物防&#xff1a;实体墙、&#xff08;隔板有龙骨架的也可以&#xff09;&#xff0c;注意吊顶&#xff1b;丙类以上的三保险防盗门、窗户要防护栏。 3.技防&#xff1a;门禁系统、报警系统、监控系统&…

真无线耳机哪个好?真无线耳机性价比排行榜

真无线蓝牙的市场需求越来越旺盛&#xff0c;它已经成为现代年轻人的标配。没有了耳机线的束缚&#xff0c;出行更加方便。随着我们蓝牙耳机市场的越来越饱和&#xff0c;现在的人基本人手一款蓝牙耳机&#xff0c;受到大环境的影响&#xff0c;性价比也是人们追求的。 Top1 N…

一种基于多神经网络的烟支缺陷分类与定位方法

摘要 为提高烟支生产过程中烟支缺陷检测效率及判断烟支缺陷产生的原因,提出基于多神经网络的烟支缺陷分类与定位方法。该方法首先对烟支数据集进行图像预处理,再采用改进VGG19网络对烟支是否存在缺陷进行预测,利用YOLOV3网络对缺陷烟支进行定位和类别判定,最后根据统计结果…

澳利率攀升,加息步伐将在某个时候放缓

澳大利亚储备银行(RBA)行长菲利普洛威表示&#xff0c;随着现金利率正接近“更正常水平”&#xff0c;大幅加息的理由已经“减弱”&#xff0c;这意味着未来将采取更小幅度的加息举措。 洛威在每半年赴国会做证词时的开场声明中指出&#xff0c;委员会将在10月4日的会议上讨论加…

Vue2 测试解决方案

Vue2测试解决方案 介绍 当构建可靠的应用时&#xff0c;测试在个人和团队构建新特征&#xff0c;重构代码&#xff0c;修复bug等工作中扮演了关键的角色。尽管测试的流派有很多&#xff0c;它们在web应用这个领域里主要有3大类&#xff1a; 单元测试组件测试端到端(E2E,end-…