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 相关文章推荐
JavaScript继承方式实例
Oct 29 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
使用JS编写的随机抽取号码的小程序
Aug 11 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
AJAX在JQuery中的应用详解
Jan 30 jQuery
20个必会的JavaScript面试题(小结)
Jul 02 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
Jul 04 Javascript
layui复选框限制选择个数的方法
Sep 18 Javascript
JavaScript图像放大镜效果实现方法详解
Jun 28 Javascript
小程序中手机号识别的示例
Dec 14 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怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
汉语言文学毕业求职信
2014/07/17 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
老人与海读书笔记
2015/06/26 职场文书
八年级物理教学反思
2016/02/19 职场文书