JavaScript按位操作符基础知识

按位非(NOT)

按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。

对 25 执行按位非操作,结果得到了 -26。这也验证了按位非操作的本质:操作数的负值减 1。

1
2
let a = 25;
console.log(~a); // -26

按位与(AND)

按位与操作符由一个和号字符(&)表示,它有两个操作符数。

简而言之,按位与操作只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0。

1
2
3
4
5
 253 执行按位与操作的结果是 1。为什么呢?请看其底层操作:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
1
2
let res = 25 & 3;
console.log(res); // 1

按位或(OR)

按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。

按位或操作在有一个位是 1 的情况下就返回 1,而只有在两个位都是 0 的情况下才返回 0。

1
2
3
4
5
253 按位或的结果是 27
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
1
2
let res = 25 | 3;
console.log(res); // 27

按位异或(XOR)

按位异或操作符由一个插入符号(^)表示,有两个操作数。

按位异或的不同之处在于,这个操作在两个数值对应位上只有一个 1 时才返回 1,如果对应的两位都是 1 或都是 0,则返回 0。所以任何数异或 0 都是其本身两个相同的数进行异或结果为 0

1
2
3
4
5
 253 按位异或的结果是 26,其底层操作如下所示:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
1
2
3
4
let res = 25 ^ 3
console.log(res) // 26
let zero = 200 ^ 0
console.log(zero) // 200

只出现一次的数字 利用异或就可以很轻松的把这道题解决