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游戏之是男人就下100层代码打包
Nov 08 Javascript
jquery怎样实现ajax联动框(一)
Mar 08 Javascript
js jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
js 自带的 map() 方法全面了解
Aug 16 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
Vue与React的区别和优势对比
Dec 18 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
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
js的写法基础分析
2011/01/17 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
vue element实现表格合并行数据
2020/11/30 Vue.js
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
python文本数据相似度的度量
2018/03/12 Python
python实现事件驱动
2018/11/21 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
实例代码讲解Python 线程池
2020/08/24 Python
python反扒机制的5种解决方法
2021/02/06 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
童装店创业计划书
2014/01/09 职场文书
环卫工人节活动总结
2014/08/29 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL