宝哥软件园

Javascript中“”和“|”的详细解释

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

一、前言:

在文章开始之前,让我们向您展示几个主题:

var num 1=1 0;console . log(num 1);//0 var num 2=' string ' 1;console . log(num 2);//0 var num 3=true 1;console . log(num 3);//1 var num 4=undefined | false;console . log(num 4);//0 var num 5=undefined | true;console . log(num 5);//1 var num 6=23 5;console . log(num 6);//5 var num 7=23 | 5;console . log(num 7);//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 0000 0001 0010,或者更简洁地说是1 0010。这是五个有效位,它们本身决定了实际值。

负数也以二进制代码存储,但采用二进制补码格式。要计算数值的二进制补码,有三个步骤:

(1)求这个值的绝对值的二进制码(例如求-18的二进制补码,先求18的二进制码);

(2)求二进制反码,即用1代替0,用0代替1;

(3)在得到的二进制补码上加1。

这样就得到-18的二进制表示,即1111 1111 1111 1111 1111 1111 1111 1111 1110 1110。

.在ECMAScript中,当对数值应用bit运算符时,在后台会发生以下转换过程:将64位数值转换为32位数值,然后执行bit运算,最后将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 num 1=10;console . log(num 1);//0 //第一个运算符Number是字符串。根据前言中的理论,先用number()函数处理非数字运算符number,结果返回NaN,将被视为0。因此,最终结果也是0 var num 2=' string ' 1;console . log(num 2);//0//true为布尔值,同样由Number()函数处理,处理后得到值1,所以对于位操作,表达式等价于“1 1”,当两个值都为1时,结果返回1var num3=true 1console . log(num 3);//1//23的二进制代码为:10111,二进制代码5是:00101.然后每一位都对齐,按照上面的规则,1011100101的结果是00101。00101为5var num6=23 5console . log(num 6);//5 //再加一个例子:24的二进制码是.11000,而7的二进制代码是.00111.同一位置的两个数字执行“与”运算,结果是.00000.所以最终结果是0,你说对吗?var add 1=24 7;console . log(add 1);//0三。“|”(按位“或”或):

按位“或”运算符由竖线符号(|)表示,也有两个运算符。本质上,按位“或”运算是将两个数值的每个位对齐,并对同一位置的两个数字执行“或”运算。

逐位OR OR运算规则:只要两个数值对应的位中有一位为1,就返回1,只有两位都为0,才返回0。

让我们举个最上面的例子来看看!

//第一个运算符number是undefined,第二个运算符number是false,两者都不是数值,所以我们必须先用Number()函数进行处理,处理结果将返回NaN,NaN将被视为0,所以最终结果为0var num4=undefined | falseconsole . log(num 4);//0//第一个运算符等于0,第二个运算符等于1。结合按位OR规则,最终结果为1var num5=undefined | trueconsole . log(num 5);//1//23的二进制代码为:10111,二进制代码5是:00101.然后,对每个位进行对齐,根据上述规则,10111|00101的结果为10111。10111是23 var num 7=23 | 5;console . log(num 7);//23//再加一个例子:24的二进制码是.11000,而7的二进制代码是.00111.同一位置的两个数字执行“与”运算,结果是.11111.所以最终结果是31。你做对了吗?var add 2=24 | 7;console . log(add 2);//31四。其他:

相信有些朋友不知道如何将数值转换成标准的二进制代码,那么有没有快速的方法呢?答案是肯定的。

我在网上随机找到一个在线转换工具地址:数值转换(点击我查看)。(当然,你也可以使用你找到的其他工具。无论如何,取得成果是我们的最终目标。)

最后附上手工转换二进制过程中总结的规则图,依然可以快速将数值转换成二进制代码,而且是满满的!

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

更多资讯
游戏推荐
更多+