eyasliu / blog

博客文章
179 stars 13 forks source link

~ 按位非 操作符的妙用 #18

Open eyasliu opened 7 years ago

eyasliu commented 7 years ago

document: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

~ 操作符,叫做 按位非,它的用途就是将q其操作数当做32位的比特序列进行反转。

有符号 32 位整数

所有的按位操作符都会将操作数转成补码形式的有符号32位整数,就是将不足32位的二进制,用0填充至32位,其中最左位是符号位,决定数字是正数还是负数。而且只会处理整数,如果操作数为浮点数,将会舍弃小数部分。如数字 5 的二进制为

101

转成补码形式的32位整数是

00000000000000000000000000000101

那对其反转比特位(~5)后,就是

11111111111111111111111111111010

负数的二进制就是对其正数的比特位取反,所以结果得到的数字就是-6

~ 按位非

经上述例子可以得到一个公式:

~x = -(x + 1)

并且是取整数,接下来讨论一下该操作付的妙用

配合 indexOf

我们使用indexOf时,如果有匹配项则返回匹配的位置,无匹配项返回 -1,判断一个元素是否存在可这样写

arr.indexOf(5) === -1

将-1代入公式得

~-1 = -(-1 + 1) 
    = 0
// ~-1 = 0

所以可简写为

~arr.indexOf(5)

取整

因为按位操作符只操作整数部分,非整数部分会被舍弃,可用于取整操作

~~2.5333 // 2

用两个按位非操作符,就可以取整了,相当于 parseInt()

注意

由于按位操作符只能操作32位的整数,所以他能操作的最大数为 (2^32 - 1),如果大于这个数字,那么公式 -(x + 1) 不再适用