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 命名空间以提高代码重用性
Nov 13 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
从零学JSON之JSON数据结构
May 19 Javascript
JQuery对表单元素的基本操作使用总结
Jul 18 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
微信小程序getPhoneNumber获取用户手机号
Sep 29 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
小程序实现展开/收起的效果示例
Sep 22 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 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
10条PHP高级技巧[修正版]
2011/08/02 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
读jQuery之一(对象的组成)
2011/06/11 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python中IPYTHON入门实例
2015/05/11 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python csv文件记录流程代码解析
2020/07/16 Python
构造器Constructor是否可被override?
2013/08/06 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
入党推优材料
2014/06/02 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
万里长城导游词
2015/01/30 职场文书
2015年客服工作总结范文
2015/04/02 职场文书