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 获取checkbox的checked问题
Nov 16 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
详解vue服务端渲染(SSR)初探
Jun 19 Javascript
详解Node全局变量global模块
Sep 28 Javascript
vue :src 文件路径错误问题的解决方法
May 15 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 Javascript
Node.js Windows Binary二进制文件安装方法
May 16 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 Javascript
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
twig里使用js变量的方法
2016/02/05 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
基于python指定包的安装路径方法
2018/10/27 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
水电工岗位职责
2014/02/12 职场文书
骨干教师个人总结
2015/02/11 职场文书
身份证丢失证明
2015/06/19 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python