zoukankan      html  css  js  c++  java
  • 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函数和位运算的内部原理。  

    ToInt32 (col|0) : Numeric Values.
     -1.6-0+011.681616.8123e-2-Infinity+InfinityNaN
    col|0 -1 0 0 1 1 8 16 16 1 0 0 0
    ToInt32 (col|0) : String Values.
     """-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
    ToInt32 (col|0) : Other Values.
     undefinednulltruefalsenew 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 

     
  • 相关阅读:
    MarkDown 语言简单使用
    开机自启宽带连网设置问题
    JqueryEasyUI EasyLoader
    JqueryEasyUI $.Parser
    FileUpload一键自动上传
    Git读档
    JavaScript typeof运算符和数据类型
    JavaScript 函数 (function)
    Javascript 对象(Object)
    JavaScript 数组(Array)
  • 原文地址:https://www.cnblogs.com/wisdomoon/p/Bit-Manipulation.html
Copyright © 2011-2022 走看看