文章目录
位运算
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 ? '奇数'

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

被折叠的 条评论
为什么被折叠?



