javascript位运算
javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面。不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与这些bits打交道,这就是我们今天的主题——javascript位运算(JavaScript Bit Manipulation)。
在讨论之前我们设定一个问题:下面的代码执行的结果是什么?
var a = "10"| 0 ;
console.log("Bitwise Or a is : " +a);
var b = "s1132"|0;
console.log("Bitwise Or b is : " +b);
var c = [1,3,2]&1 ;
console.log("Bitwise And c is : " +c);
var d = [1]|0;
console.log("Bitwise Or d is : " +d);
var e = ~function(){}();
console.log("Bitwise Not e is : " +e);
var f = ({})|0;
console.log("Bitwise Or f is : " +f);
var g = ([1])|0;
console.log("Bitwise Or g is : " +g);
var h = "1ss"^0;
console.log("Bitwise Exclusive Or h is : " +h);
同时,希望大家查阅一下四个基本的位运算的原理:and(按位与)、 or(按位或)、 not(按位反) Exclusive Or(亦或) 。
今天我们不分析计算机里面的二进制原理,也不分析4个基本位运算的具体原理。我们分析的重点是在javascript这门语言中,高级的部分与位运算是如何结合的,在javascript中位运算能为我们带来什么。
一、javascript中的位运算
javascript中的位运算非常复杂,由于javascript试图创建完全无类型(弱类型)的数据,因此数字以64位浮点值存储,即双精度的浮点数。
正如大家所料,javascript中没有你想使用的Integer(整型)类型。当我们需要用到integer类型时,javascript会内部执行 Toint32方法(浏览器内部函数,外部不可调用)将值直接转化为32位的integer以供调用,并将原值瞬间转换回双精度浮点型。
javascript与其他语言的不同之一就是它奇怪的位运算。
何时会用到integer,Toint32方法到底是怎么回事,稍后介绍···
二、javascript位运算符
javascript有一系列位运算符,这里不一一列举。我们简单看看下面4个逻辑运算符
And |
& |
Or |
| |
Exclusive Or |
^ |
Not |
~ |
和其他语言一样,"非"运算符的优先级最高。
类似的运算符 &&,||,!他们只运用在boolean运算中,而不是位运算。
位运算基于数值数据也就是我们刚才提到的"integer"(被从64-bits floating point 经过 Toint32方法转化而来的32-bits integer),位运算结束后再被转化成双精度浮点型。
三、Toint32方法
Toint32我们不能调用,也不好猜测内部的实现逻辑,我们将它的规律总结如下:
1、忽略所有的小数部分
2、如果超出了32位整型能存储的范围,结果是1的二进制补码(即-1)
3、如果是一个小于1的小数,结果是0
4、如果是Infinity(无论正无穷还是负无穷)或者NAN,结果是0
5、如果是true返回1、false返回0
实际上javascript的位运算符并不是最快的,因为他们被限制为32位,而且需要从双精度浮点型转换而来并且再转化回去,尽管如此他们比传统的操作符要快,因为他们更接近于底层。
下面是和0进行 Or操作的结果,这充分验证了Toint32函数和位运算的内部原理。
-1.6 | -0 | +0 | 1 | 1.6 | 8 | 16 | 16.8 | 123e-2 | -Infinity | +Infinity | NaN | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
col|0 | -1 | 0 | 0 | 1 | 1 | 8 | 16 | 16 | 1 | 0 | 0 | 0 |
"" | "-1.6" | "0" | "1" | "1.6" | "8" | "16.8" |
"123 e-2" |
"010" (Octal) |
"0x10" (Hex) |
"0xFF" (Hex) |
"-010" | "-0x10" | "xx" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
col|0 | 0 | -1 | 0 | 1 | 1 | 8 | 16 | 1 | 10 | 16 | 255 | -10 | 0 | 0 |
undefined | null | true | false | new Object() | function(){ return; } |
|
---|---|---|---|---|---|---|
col|0 | 0 | 0 | 1 | 0 | 0 | 0 |
四、位运算的用途
通过上面的讨论,开篇留给读者思考的问题显得很简单,如有问题,请浏览讨论。下面我们看看位运算的常见用途。
1、替代一些简单的算数运算
例:24<<2==24*4
32>>3==32/8
2、随机整数
var ran=Math.random();
alert("a:"+((ran*5)|0));//rang=0-4
alert("a:"+((ran*5)|1));//rang=1-5
3、奇偶判断
for(var i=0;i<10;i++){
if(i&1){
alert("num is odd!");
}
}
4、浮点数取整
if(num>=0){
num|0==Math.floor(num);
}else{
num|0==Math.ceil(num);
}
位运算的用途建议大家参考 曾少的个人博客http://www.hehe0.com/javascript-wei-yun-suan-xiao-ji/
总结:javascript位运算在我们的日常开发中很少用到,但是深入了解位运算可以帮我们编写高性能的代码。由于水平有限,如文中内容有误欢迎指正。
参考资料:http://www.i-programmer.info/programming/javascript/2550-javascript-bit-manipulation.html
http://jibbering.com/faq/notes/type-conversion/
如需转载,请说明出处:http://www.cnblogs.com/wisdomoon/p/3338327.html
javascript位运算的更多相关文章
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...
- javascript 位运算
位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...
- leetcode - 位运算题目汇总(下)
接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...
- 位运算总结&拾遗
JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...
- javascript的变态位运算
javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...
- 【JavaScript】进制转换&位运算,了解一下?
前言 在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它.作为一位编程人员,这些都是基础知识.如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难.本文你将会学习到: 进制转 ...
- javascript中的类型转换(进制转换|位运算)
1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...
- javascript中的位运算,
罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
随机推荐
- 【uoj264】 NOIP2016—蚯蚓
http://uoj.ac/problem/264 (题目链接) 题意 n条蚯蚓,时间为m.每单位时间要可以将最长的蚯蚓切成len/2和len-len/2两份,长度为0的蚯蚓不会消失,因为每单位时间所 ...
- CMMI3标准文档模板大全
链接:http://pan.baidu.com/s/1c2cGX8W 密码:ulns
- 学习通过Thread+Handler实现非UI线程更新UI组件
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- iOS “智慧气象”APP中用到的第三方框架汇总
“智慧气象”是我最近在公司接手的项目,已经完成最新版本的更新并上架,在此分享下其中用到的第三方框架的使用. 应用地址:APP商店搜索“智慧气象” MJRefresh(下拉刷新)业界知名下拉刷新框架就不 ...
- U型进度条
今天同事说要做一个U型进度条的效果. 本打算上网找一个,结果找了一个纯CSS3打造的,不过最坑人的是他把进度条从1到100,挨个设置了CSS属性. 这不得活活累死宝宝~~~~~~~~~~~~~~. 于 ...
- AngularJs 脏值检查及其相关
今天突然就想写写$digest和$apply,这些都是脏值检查的主体内容. 先以普通js来做一个简单的监控例子吧: var div = ducoment.getElementById("my ...
- AngularJs ngApp、ngBind、ngBindHtml、ngNonBindable
ngApp 使用这个指令自动启动一个AngularJS应用.ngApp指令指定了应用程序的根节点,通常会将ngApp放置在网页的根节点如<body>或<html >标签的. 格 ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- Spring data jpa批量插入和更新
http://blog.csdn.net/wangshfa/article/details/27323297 1 public interface BatchDao<T> { 2 ...
- HTML5学习总结-04 音频&视频播放
一 音频播放 1 Audio(音频) HTML5提供了播放音频文件的标准 2 control(控制器) control属性攻添加播放,暂停和音量空间. 3 标签定义声音 <audio> 例 ...