Javascript中的 “&” 和 “|” 你懂微?

一、前言:

以篇章开始前,先来几乎单问题让大家省:

     var num1 = 1 & 0;
        console.log(num1); // 0

        var num2 = 'string' & 1;
        console.log(num2); // 0

        var num3 = true & 1;
        console.log(num3); // 1

        var num4 = undefined | false;
        console.log(num4); // 0

        var num5 = undefined | true;
        console.log(num5); // 1

        var num6 = 23 & 5;
        console.log(num6); // 5

        var num7 = 23 | 5;
        console.log(num7); // 23

地方的题材大家还做对了吧?我们事先来总过
《说说javascript中的“&&”和“||”》,“&&”
和 “||” 是逻辑运算表达式中之操作符。那么一个 “&” 或者一个 “|”
又象征什么意思呢?有什么特色也?接下,我们不怕来挨家挨户揭秘。

率先,我们得清楚 “&” 和 “|”
是各运算操作符。

位运算符用于在极其中心的层次上,即以内存中表示数值的位来操作数值。ECMAScript中的备数值都为IEEE-754
64员格式存储,但各操作符并无直接操作64号之值。而是先用64各类的价值转换成为32各类之平头,然后实施操作,最后又将结果转换为64各。对于开发人员来说,由于64个存储格式是晶莹的,因此整个过程即像是仅仅设有32位之整数一样。
于有标志的整数,32号受之先头31号用于表示整数的值。第32位表示数值的符号:0代表正数,1象征负数。这个象征符号的位叫做符号位,符号位之值决定了其他各数值的格式。其中,正数以纯二迈入制格式存储,31号被之每一样各类都意味着2之幂。第一各项(叫做位0)表示20,第二各代表21,以此类推。没有动的各以0表示,即忽略不计。例如,数值18之二进制表示是0000
0000 0000 0000 0000 0000 0001
0010,或者再次简明之10010。这是5只有效位,这5各类我就决定了事实上的值。
负数同样因二进制码存储,但利用的格式是二进制补码。计算一个数值的二进制补码,需要通过下列3单步骤:
(1)求者数值绝对值的二进制码(例如,要求-18的二进制补码,先要18之二进制码);
(2)求其次进制反码,即将0替换为1,将1交替为0;
(3)得到的二进制反码加1。
诸如此类,求得了-18之二进制表示,即1111 1111 1111 1111 1111 1111 1110
1110。
……在ECMAScript中,当对数值应用位操作符时,后台会有如下转换过程:64个的数值为移成为32员数值,然后实施各项操作,最后再以32位的结果转换回64号数值。这样,表面上看起便类似是以操作32各项数价值,就和于外语言中盖接近方式履行二进制操作一样。但此转换过程吧致使了一个重的副效应,即在针对突出的NaN和Infinity值应用位操作时,这半独价值都见面让当成0来处理。
如若对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再次使用位操作。得到的结果以凡一个数值。
……(截取自《Javascript高级程序设计》)

 

二、“&”(按位与AND):

据位与操作符由一个及号字符(&)表示,它发少单操作符数。从精神上来讲,按位以及操作就是将片个数值的各国一样位对一起,对平位置及之鲜只数执行AND操作。

照各以及AND操作规则:只有区区只数值的应和位还是1时才回到1,任何一样位是0,结果都是0。

前方早已将理论性的东西说的最为多了,但是自认为理论以坏有必要。接下来,直接解析例子吧!

咱们先押上面题目中之
num1,num2,num3以及num6。我们品尝做地方的反驳来分析为什么会输出最终的结果。

 // num1是1和0进行“按位与”操作后的返回值。1的二进制码简写为1,0的二进制码简写为0,根据上面的规则,第二个操作符数为0,结果是0
    var num1 = 1 & 0;
    console.log(num1); // 0

    // 第一个操作符数是字符串,按照前言里面的理论,对于非数值的操作符数,先使用Number()函数处理,结果返回NaN,NaN又会被当成0来处理。所以最终结果也是0
    var num2 = 'string' & 1;
    console.log(num2); // 0

    // true是布尔类型值,同样使用Number()函数处理,处理后得到数值1,于是表达式就相当于“1 & 1” 进行位运算,当两个数值都为1的时候,结果返回1
    var num3 = true & 1;
    console.log(num3); // 1

    // 23的二进制码是:...10111,5的二进制码是:...00101。然后每一位进行对齐处理,结合上面的规则,可以得出10111&00101的结果是:00101。00101就是5
    var num6 = 23 & 5;
    console.log(num6); // 5

    // 再加个例子:24的二进制码为...11000,7的二进制码为...00111,相同位置的两个数执行AND操作,结果发现结果是...00000。所以最终结果是0,你算对了吗?
    var add1 = 24 & 7;
    console.log(add1); // 0 

 

三、“|”(按位或OR):

仍个还是操作符由一个竖线符号(|)表示,同样产生半点个操作符数。从精神上来讲,按个还是操作为是拿少独数值的各一样员对一头,对同位置ECMAScript及之有数独数执行OR操作。

按部就班各还是OR操作规则:只要简单独数值的照应位有一个凡是1就是归1,而只有当有限只各类都是0的情下才回去回0。

俺们对接太上面的事例来拘禁吧!

 // 第一个操作符数为undefined,第二个操作符数是false,均不是数值,所以都要先使用Number()函数处理,处理结果都是返回NaN,NaN又会被当成0处理,于是最终结果是0
    var num4 = undefined | false;
    console.log(num4); // 0

    // 第一个操作符数相当于0,第二个操作符数相当于1,结合按位或的规则,最终结果是1
    var num5 = undefined | true;
    console.log(num5); // 1

    // 23的二进制码是:...10111,5的二进制码是:...00101。然后每一位进行对齐处理,结合上面的规则,可以得出10111|00101的结果是:10111。10111就是23
    var num7 = 23 | 5;
    console.log(num7); // 23

    // 再加个例子:24的二进制码为...11000,7的二进制码为...00111,相同位置的两个数执行AND操作,结果发现结果是...11111。所以最终结果是31,你算对了吗?
    var add2 = 24 | 7;
    console.log(add2); // 31

 

四、其他:

深信也会生出一些有情人不亮堂怎么把数值转换成为规范的二进制码,那么有没有发生快速的方式也?答案是迟早之。

自我的网上自由找到了一个在线转换工具地址:数值进制转换(点自己翻)。(当然,你吧足以以你找到的别的工具,不管怎样,能落实力量就是是咱的尾声目的)

最终,再沾自经过手写转换二前行制过程遭到总结的规律图,依然可以快捷将数值转换成为二进制码,逼格满满哒!

ECMAScript 1