Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
eyasliu opened this issue Oct 22, 2016 · 0 comments
Open

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

eyasliu opened this issue Oct 22, 2016 · 0 comments

Comments

@eyasliu
Copy link
Owner

eyasliu commented Oct 22, 2016

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) 不再适用

@eyasliu eyasliu changed the title ~ 操作符的妙用 ~ 按位非 操作符的妙用 Oct 22, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant