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中“+=”的应用
Feb 02 Javascript
jquery()函数的三种语法介绍
Oct 09 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
Apr 24 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
Jul 18 Javascript
JavaScript实现图片懒加载(Lazyload)
Nov 28 Javascript
AngularJS获取json数据的方法详解
May 27 Javascript
ztree简介_动力节点Java学院整理
Jul 19 Javascript
使用vue-cli导入Element UI组件的方法
May 16 Javascript
ES6 Map结构的应用实例分析
Jun 26 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+mysql写的简单留言本实例代码
2008/07/25 PHP
php adodb连接不同数据库
2009/03/19 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php里array_work用法实例分析
2015/07/13 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Highcharts入门之简介
2016/08/02 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
浅析Python中的for 循环
2016/06/09 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
英语简历自我评价
2014/01/26 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
公司离职证明样本
2014/09/13 职场文书
实习计划书范文
2015/01/16 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
以下牛机,你有几个
2022/04/05 无线电