js位运算详解及巧妙应用

本文详细介绍了JavaScript中的位运算,包括按位或、按位与、按位非、按位异或、左移、有符号右移和无符号右移。位运算在JavaScript中的特点是快速,但需要注意其对非数值的转换。文章列举了多个应用场景,如判断奇偶、不借助额外变量交换变量值、数组元素判断和用户权限判断等。位运算在提高代码性能方面具有优势,但也可能降低代码可读性。
摘要由CSDN通过智能技术生成

位运算

JavaScript中的数字以浮点数的形式64位存储。但在位运算中,数字被转换为有符号32位整数格式。每种位操作均直接在这32位数上实现结果,返回值也是有符号的32位整数。最后再将这32位的结果转换回64位数值。

这种转换导致了一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0处理。

如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。

js中的位运算有 按位或(|)按位与(&)按位非(~)按位异或(^)左移(<<)有符号右移(>>)无符号右移(>>>)。注意与逻辑运算符进行区分。

位运算的优先级很低,注意需要加上括号增加优先级。

按位或(|)

规则:有1为1,全0为0

这里举一个或运算的例子,两个操作数一正一负(正数的二进制直接以原码的形式存储,负数以补码的形式存储)。

对于 -1 | 2
在这里插入图片描述
这里由于32位太长,就直接把最后一位放在了第四位。可以看到,结果为-1。

按位与(&)

规则:有0为0,全1为1

按位非(~)

规则:返回数值的反码

本质:操作数的负值减1(-x-1)

按位异或(^)

规则:相同为0,不同为1

左移(<<)

规则:数值的所有位向左移动指定的位数,右侧的空位用0补齐

特点:每左移一位,原操作数乘以一个2

借此,我们可以利用有符号右移来代替所有的乘2或乘2^n运算。

注意: 左移不会影响操作数的符号位

有符号右移(>>)

规则:将数值向右移动,但保留符号位,左侧空位用符号位补齐

特点:每右移一位,原操作数除以一个2

借此,我们可以利用有符号右移来代替所有的除2乘2或除2^n运算。

无符号右移(>>>)

规则:将数值所有32位都向右移动,左侧空位用0补齐

注意: 无符号右移操作会将负数的二进制码(补码)当成正数的二进制码,因此结果往往很大。而该操作会将左侧空位用0补齐,因此结果为正数。

位运算的特点

位运算符较快 —— 当进行数学运算的时候,位运算操作比任何布尔运算或者算术运算快。选择性地用位运算替换算术运算可以极大地提升复杂运算的性能。

同时,位运算也有着让代码可读性变差的缺点。

位运算应用场景举例

1. 判断奇偶 —— 按位与(&)

由于偶数的最低位是0,奇数的最低位是1。那么如果一个数是偶数,那么它与1(二进制中只有最后一位为1)进行位“与”操作的结果就是0,相反如果是奇数的话,结果就是1。

利用这个特性,我们可以利用num & 1来判断奇偶。

return num & 1 === 1 ? '奇数' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值