手机版

javascript运算符——位运算符综合介绍

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

前面的话

位操作符是非常低级的操作,不常用,因为不直观。但是速度极快,合理使用可以达到很好的效果。本文将介绍在javascript中经常被忽略的运算符——位运算符

二进制表示法

ECMAScript中的所有数值都以IEEE-754 64位格式存储,但bit运算符并不直接对64位值进行运算,而是对32位有符号整数进行运算,返回值也是32位有符号整数

这种位转换使特殊的NaN和Infinity值在应用位操作时被视为0

如果对非数值应用位运算符,则使用Number()将该值转换为数值,然后应用位运算,结果为数值

//'| '表示按位OR,一个整数和0按位OR可以得到自身,一个小数和0按位OR可以得到舍入效果console . log(1.3 | 0);//1 con sole . log(1.8 | 0);//1 con sole . log(Infinity | 0);//0 console . log(-Infinity | 0);//0 console . log(NAn | 0);//0 console . log(' 12px ' | 0);//0 console . log(' 12 ' | 0);//12个有符号整数使用32位中的前31位表示整数值,第32位表示整数符号,0表示正数,1表示负数。代表符号的位称为符号位,符号位的值决定了其他位值的格式。其中,正数以纯二进制格式存储,31位中的每一位代表2的幂。第一位(称为位0)表示2的0倍,第二位表示2的1倍,依此类推。未使用的位用零填充,这意味着它们被忽略

例如,值18的二进制表示为0000000000000000000000000000000010010或10010,这样更简洁。这是五个有效位,它们本身决定了实际值

console.log((18)。toString(2));//'10010'

console . log(0b 00000000000000000000000000000010010);//18

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

[1]用于查找该值绝对值的二进制代码

[2]求二进制反码,即用1代替0,用0代替1

[3]给二进制补码加1

例如,要确定-18的二进制表示,必须首先获得18的二进制表示,如下所示:

0000 0000 0000 0000 0000 0000 0000 0000 0001 0010接下来,计算二进制补码,如下所示:

1111 1111 1111 1111 1111 1111 1111 1110 1101最后,给二进制补码加1,如下所示:

1111 1111 1111 1111 1111 1111 1111 1110 1101 1-1111 1111 1111

ECMAScript会尽最大努力向我们隐藏所有这些信息。当以二进制字符串的形式输出负数时,我们只在负数绝对值的二进制代码前看到一个负号

var num=-18;console . log(num . tostring(2));//'-10010 '位运算符可以执行七种操作,包括按位“非”、按位“与”、按位“或”、按位“异或”、左移、带符号右移和无符号右移

按位非(非)

按位非运算符由波浪线(~)表示,执行按位非的结果是返回数值的倒数。其本质是操作数的负值减1

var num1=25var num2=~ num1console . log(num 2);//-26按位否定一个整数两次可以得到它自己;您可以通过对一个小数进行两次按位否定来获得舍入效果

console . log(~ ~ 3);//3 con sole . log(~ ~ 3.1);//3 con sole . log(~ ~ 3.9);//3位“与”(AND)

按位“与”运算符由&符号()表示,它有两个运算符编号。本质上,按位and运算是将两个数值的每一位对齐,然后按照下表的规则对同一位置的两个数字进行AND运算

第一个数值的位和第二个数值的位结果1 1 11 0 00 1 00 0按位“与”运算只有当两个数值的对应位为1时才返回1,任何一位为0,结果为0。

var IResult=25 ^ 3;console . log(IResult);//'1'//分析如下:25=0000 0000 0000 0000 0001 1001 3=0000 0000 0000 0000 0000 0000 0000 0000 00000 00011-

按位or运算符由竖线符号(|)表示,它也有两个操作数。按位“或”运算遵循以下真值表

第一数值的比特和第二数值的比特结果是1 1 11 0 10 1 10 0 0。如果一位为1,它将返回1,但前提是两位都为0。

var IResult=25 | 3;console . log(IResult);//'27'//分析如下:25=0000 0000 0000 0000 0001 1001 3=0000 0000 0000 0000 0000 0000 0011 0000 0000 0000 0000 0001 1011一个整数可以与0按位“或”得到自身,一个十进制数可以与0按位“或”得到舍入效果

console . log(3.1 | 0);//3 con sole . log(3.9 | 0);//3位异或(XOR)

按位异或运算符由插入符号()表示,也有两个操作数。下面是按位异或的真值表

当两个数值相同,但不是同时为1时,第一个数值的比特和第二个数值的比特结果1 1 01 0 10 1 10 0 0 0返回0

var iresult=25 ^ 3;console . log(IResult);//'26'//分析如下:25=0000 0000 0000 0000 0001 1001 3=0000 0000 0000 0000 0000 0000 0011 00 0000 0000 0000 0000 0000 0001 1010“异或运算”有一个特殊的应用,它连续三次对两个数字A和B进行异或运算这意味着“异或运算”可以交换两个变量的值,而不会引入临时变量

var a=10,b=9;^=b、^=a、^=b;console.log(a,b);//9,10//分析如下:a=0000 0000 0000 0000 0000 1010 b=0000 0000 0000 0000 0000 0000 1001-1001 0 0000 0000 0000 0000 0000 0000 0011 a1=0000 000 0000 000 000 000 000 0000 0000 0000 0000 0000 0000B=b1=9一个整数可以与0按位异或以保持自身,一个十进制数可以与0按位异或以取整

console . log(3.1 ^ 0);//3 con sole . log(3.9 ^ 0);//3向左移动

左移位运算符由两个小于号()表示,该运算符将值的所有数字向左移位指定的位数

例如,如果值2(二进制代码为10)向左移动5位,则结果为64(1000000)

var old value=2;var newValue=oldValue5console . log(NewValue);//64左移不影响操作数的符号位。换句话说,如果将-2向左移动5位,结果将是-64

var old value=-2;var newValue=oldValue5console . log(NewValue);//-64向左移动0位,实现舍入效果

console . log(3.1 0);//3 con sole . log(3.9 0);//3向右移动符号

带符号的右移位运算符由两个大于号()表示。该运算符将值向右移动,但保留符号位(即符号标记)。有符号右移位操作与左移位操作相反,也就是说,如果64向右移位5位,结果将变回2

var oldValue=64var newValue=oldValue5console . log(NewValue);//2同样,在移位的过程中,原始值也会有间隙。只是这次空缺出现在原始值的左侧和符号位的右侧。此时,ECMAScript将用符号位的值填充所有空缺,以便获得完整的值

向右移动以模拟2的可除性

console . log(51);//2 con sole . log(151);//7向右移动,不带标志

无符号右移位运算符由三个大于号()表示,它将值的所有32位向右移位。对于正数,无符号右移的结果与有符号右移的结果相同。这仍然是一个将前面的标志向右移动的问题。如果将64个无符号的右移5位,结果仍然是2

var oldValue=64var newValue=oldValue5console . log(NewValue);//2但是,对于负数就不一样了。首先,无符号右移位用0填充空位,而不是像有符号右移位那样用符号位的值填充空位。因此,正数的无符号右移结果与标题为右移的结果相同,但负数的结果不同。其次,无符号右移算子将负二进制码视为正二进制码。此外,由于负数以其绝对值的二进制补码的形式表示,所以无符号右移的结果非常大

var old value=-64;var newValue=oldValue5Console.log(新值)//134217726要确定-64的二进制表示,必须首先获得64的二进制表示,如下所示:

0000 0000 0000 0000 0000 0000 0000 0000 0100 0000接下来,计算二进制补码,如下所示:

1111 1111 1111 1111 1111 1111 1111 1111 1011 1111最后,给二进制补码加1,如下所示

1111 1111 1111 1111 1111 1111 1111 1011 1111 1-1111.

0000 0111 1111 1111 1111 1111 1111 1110 console . log(0b 0000011111111111111111111111111111111111111111110);//134217726常见应用

[1]乘法

使用左移位()实现乘法

console . log(2 1);//4 console . log(3 1);//6 console . log(4 1);//8 [2]除法运算

用带符号的右移()模拟2的除法

console . log(2 1);//1 con sole . log(5 1);//2 con sole . log(8 1);//4 con sole . log(9 1);//4 [3]值交换

值交换的效果可以通过异或运算()来实现

var a=10,b=9;^=b、^=a、^=b;console.log(a,b);//小数点后9,10 [4]位四舍五入

十进制舍入效果可以通过按位“非”两次、按位“或”0、按位“异或”0、向左移动0位和向右移动0位来实现

console . log(~ ~ 3.1);//3 con sole . log(3.1 | 0);//3console.log(3.1^0);//3 con sole . log(3.10);//3 con sole . log(3.10);//3 [5]开关

位运算符可用作设置对象属性的开关。假设一个对象有四个开关,每个开关都是一个变量。然后,您可以设置一个四位二进制数,它的每一位对应一个开关

var FLAG _ A=1;//0001 var FLAG _ B=2;//0010 var FLAG _ C=4;//0100 var FLAG _ D=8;//1000上面的代码设置了四个开关A、B、C和D,每个开关都有一个二进制位。

现在假设您需要打开ABD的三个开关,我们可以构造一个掩码变量

var mask=FLAG _ A | FLAG _ B | FLAG _ D;//0001 | 0010 | 1000=1011上面的代码“OR”表示ABD三个变量,掩码值为二进制1011

//OR操作可以确保指定的开关标志=flags | mask打开;//“与操作”可以关闭当前设置中与开关设置不同的所有项目。flags=flags掩码;//“异或运算”可以切换当前设置,即第一次执行可以得到当前设置的相反值,第二次执行可以得到原始值flags=flags mask//“无操作”可以反转当前设置,即原设置为0,操作后变为1;原设置为1,操作后变为0flags=~ flags以上对javascript运算符——位运算符的全面介绍,是边肖与大家分享的全部内容,希望能给大家一个参考和支持。

版权声明:javascript运算符——位运算符综合介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。