javascript中负数算术右移、逻辑右移的奥秘探索


Posted in Javascript onOctober 17, 2013

javascript中负数的算术右移和逻辑右移都十分的让人迷惑,特别是逻辑右移>>>,你会发现即使一个很小的负数,右移之后,也会得到一个无比巨大的数,这是为什么呢?

原来在逻辑右移中符号位会随着整体一起往右移动,这样就是相当于无符号数的移动了,最后得到的就是一个正数,因为符号位不存在了。首先逻辑右移产生的一定是32位的数,然后负数的符号位为1,这意味着从第32位到符号位的位置全部由1填充,这样的数能不大吗例如-1,逻辑右移0位表现形式就是1111 1111 1111 1111 1111 1111 1111 1111 ,这样的数是当作正数来对待的!所以将-1逻辑右移N位,最后的结果都是全为1!

左移运算保留数字的符号位。例如,如果把 -2 左移 5 位,得到的是 -64,而不是 64。“符号仍然存储在第 32 位中吗?”是的,不过这在 ECMAScript 后台进行,开发者不能直接访问第 32 个数位。即使输出二进制字符串形式的负数,显示的也是负号形式(例如,-2 将显示 -10。)

有符号右移运算

有符号右移运算符由两个大于号表示(<$lt;)。它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。例如,把 64 右移 5 位,将变为 2:

var iOld = 64; //等于二进制 1000000
var iNew = iOld >> 5; //等于二进制 10 十进制 2同样,移动数位后会造成空位。这次,空位位于数字的左侧,但位于符号位之后。ECMAScript 用符号位的值填充这些空位,创建完整的数字,如下图所示:

无符号右移运算

无符号右移运算符由三个大于号(>>>)表示,它将无符号 32 位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。

用有符号右移运算中的例子,把 64 右移 5 位,将变为 2:

无符号右移运算用 0 填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理。

由于无符号右移运算的结果是一个 32 位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字。例如,如果把 -64 右移 5 位,将得到 134217726。如果得到这种结果的呢?

要实现这一点,需要把这个数字转换成无符号的等价形式(尽管该数字本身还是有符号的),可以通过以下代码获得这种形式:

var iUnsigned64 = -64 >>> 0;

然后,用 Number 类型的 toString() 获取它的真正的位表示,采用的基为 2:代码如下:

alert(iUnsigned64.toString(2));

这将生成 11111111111111111111111111000000,即有符号整数 -64 的二进制补码表示,不过它等于无符号整数 4294967232。

出于这种原因,使用无符号右移运算符要小心。

现在来说一下负数的算术右移>>:

我们发现-9>>2=-3,为什么是-3呢?

首先符号位是不变的,不参加右移,然后在9右移的过程中,最低位为1的话,那么右移之后最低位仍然为1!这是很奇怪的。

Javascript 相关文章推荐
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
js中的push和join方法使用介绍
Oct 08 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
javascript中类的定义方式详解(四种方式)
Dec 22 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
简单了解JavaScript异步
May 23 Javascript
js实现坦克移动小游戏
Oct 28 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
Oct 17 #Javascript
js实现的常用的左侧导航效果
Oct 17 #Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 #Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 #Javascript
JS操作数据库的实例代码
Oct 17 #Javascript
JavaScript调用后台的三种方法实例
Oct 17 #Javascript
9行javascript代码获取QQ群成员具体实现
Oct 16 #Javascript
You might like
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
python爬取内容存入Excel实例
2019/02/20 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python是否适合网页编程详解
2019/10/04 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
会计专业自我鉴定范文
2013/10/06 职场文书
教师党员思想汇报
2014/01/06 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
司马光教学反思
2014/02/01 职场文书
优秀食品类广告词
2014/03/19 职场文书
业务员自荐信范文
2014/04/20 职场文书
交通事故责任认定书
2015/08/06 职场文书
初三语文教学反思
2016/03/03 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏
源码安装apache脚本部署过程详解
2022/09/23 Servers