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中的事件
Sep 23 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
Mar 20 Javascript
JS 去前后空格大全(IE9亲测)
Jul 15 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
Aug 13 Javascript
node.js中的fs.read方法使用说明
Dec 17 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
jquery插件jSignature实现手动签名
May 04 Javascript
JS使用eval()动态创建变量的方法
Jun 03 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
javascript回调函数详解
Feb 06 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 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
用PHP4访问Oracle815
2006/10/09 PHP
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
php数据库抽象层 PDO
2011/05/07 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
jQuery提交多个表单的小技巧
2014/07/27 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
理解javascript中的闭包
2017/01/11 Javascript
树结构之JavaScript
2017/01/24 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
super关键字的用法
2012/04/10 面试题
七匹狼男装广告词
2014/03/21 职场文书
抗震救灾标语
2014/06/26 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
高中家长意见怎么写
2015/06/03 职场文书
小学英语课教学反思
2016/02/15 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技