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 相关文章推荐
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
JavaScript获取页面中第一个锚定文本的方法
Apr 03 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
JavaScript简单修改窗口大小的方法
Aug 03 Javascript
分享五个有用的jquery小技巧
Oct 08 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
简单理解vue中Props属性
Oct 27 Javascript
使用watch监听路由变化和watch监听对象的实例
Feb 24 Javascript
Vue 中使用 CSS Modules优雅方法
Apr 09 Javascript
详解Angular5 路由传参的3种方法
Apr 28 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
微信小程序加载机制及运行机制图解
Nov 27 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 透明水印生成代码
2012/08/27 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
javascript简易画板开发
2020/04/12 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
医药营销专业个人自荐信
2013/09/29 职场文书
信息专业本科生个人的自我评价
2013/10/28 职场文书
董事长岗位职责
2013/11/30 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
物业管理工作方案
2014/05/10 职场文书
小学感恩主题班会
2015/08/12 职场文书
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL