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代码
Aug 13 Javascript
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
JavaScript中双叹号(!!)作用示例介绍
Apr 10 Javascript
jquery密码强度校验
Dec 02 Javascript
AngularJS表单验证中级篇(3)
Sep 28 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
May 02 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 Javascript
jQuery实现动态添加和删除input框实例代码
Mar 26 jQuery
jquery ui 实现 tab标签功能示例【测试可用】
Jul 25 jQuery
vue+axios实现post文件下载
Sep 25 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
PHP也可以?成Shell Script
2006/10/09 PHP
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
Python实现的双色球生成功能示例
2017/12/18 Python
Python3生成手写体数字方法
2018/01/30 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
OpenCV 模板匹配
2019/07/10 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
市场安全管理制度
2014/01/26 职场文书
初中生期末评语大全
2014/04/24 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
物资采购方案
2014/06/12 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
教师思想工作总结2015
2015/05/13 职场文书
开业典礼致辞
2015/07/29 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python