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 要点归纳(三) jQuery中的事件和动画(上:事件篇)
Mar 24 Javascript
JavaScript中获取元素索引的函数
Sep 10 Javascript
简短几句 通俗解释javascript的闭包
Jan 17 Javascript
$.getJSON在IE下失效的原因分析及解决方法
Jun 16 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
Oct 14 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
JS中的三个循环小结
Jun 20 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
Jul 19 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
JS为什么说async/await是generator的语法糖详解
Jul 11 Javascript
详解Vue的mixin策略
Nov 19 Vue.js
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 高手之路(三)
2006/10/09 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
js实现图片无缝滚动
2015/12/23 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
python抓取网页中图片并保存到本地
2015/12/01 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
柏林通行证:Berlin Pass
2018/04/11 全球购物
中科软笔试题和面试题
2014/10/07 面试题
网吧收银员岗位职责
2013/12/14 职场文书
应届毕业生求职信范文分享
2013/12/26 职场文书
大学生自我鉴定范文
2013/12/28 职场文书
yy司仪主持词
2014/03/22 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
2016年少先队活动总结
2016/04/06 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
Python实现照片卡通化
2021/12/06 Python