异或位运算符算法
| a | b | a^b |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
总结来说就是: 相同就是0,不同就是1
举例子:
const a = 1
const b = 2
01 (a 的二进制) 就是 1 X 2º + 0 X 2¹ = 1 + 0 = 1
10 (b 的二进制) 就是 0 X 2º + 1 X 2¹ = 0 + 2 = 2
---
11 (a ^ b = 1 ^ 2 = 1 X 2º + 1 X 2¹ = 3 的二进制)
这一篇我们着重来看一下这个异或为运算是如何交换变量的。
let a = 1
let b = 2
a = a ^ b
b = a ^ b
a = a ^ b
这样在控制台打印一下a和b的输出
可以看到 a和b 的值如下:
console.log('a', a) // 2
console.log('b', b) // 1
那让我们来分析一下,它们是怎么通过 a^b 就可以交换数据的呢?
a = a ^ b // 3
b = a ^ b // 3 ^ 2 = 11 + 10 = 01 = 1 X 2º + 0 X 2¹ = 1 + 0 = 1 的二进制
a = a ^ b // 3 ^ 1 = 11 + 01 = 10 = 0 X 2º + 1 X 2¹ = 0 + 2 = 2 的二进制
∴ b = 1, a = 2
解:
∵ a = a ^ b = 1 ^ 2
1换算成二进制 等于 01
2换算成二进制 等于 10
∵ 相同就是0,不同就是1,
01
10
= 11
11 是3的二进制,也就是 1 X 2º + 1 X 2¹ = 1 + 2 = 3
∵ b = a ^ b = 3 ^ 2
3换算成二进制 等于 11
2换算成二进制 等于 10
11
10
= 01
01 是1的二进制
∴ b = 1
∵ a = a ^ b = 3 ^ 1
3换算成二进制 等于 11
1换算成二进制 等于 01
11
01
= 10
10 是2的二进制
∴ a = 2
当然
a = a ^ b
b = a ^ b
a = a ^ b
可以表达为:
a ^= b // 等同于 a = a ^ b
b ^= a // 等同于 b = b ^ a
a ^= b // 等同于 a = a ^ b
注意:由于位运算符只对整数起作用,如果一个运算数不是整数,会自动转为整数后再运行。所以这个方法用来交换变量是有局限性的,那就是: “只能交换整数”。
拓展:
交换变量的七种方案
-
1、
临时变量;let a = 1, b = 2; let c c = a a = b b = c -
2、
解构赋值;let a = 1, b = 2; [a, b] = [b, a] -
3、
加减法交换;let a = 1, b = 2; a = a + b b = a - b a = a - b -
4、
位运算符;let a = 1, b = 2; a = a ^ b b = a ^ b a = a ^ b -
5、
对象赋值;let a = 1, b = 2; a = { a: b, b: a } b = a.b a = a.a -
6、
数组赋值;let a = 1, b = 2; a = [a, b] b = a[0] a = a[1] -
7、
数组赋值1
let a = 1, b = 2;
a = [b, b = a] = [0]
或者
let a = 1, b = 2;
b = [a, a = b] = [0]
执行顺序是先 数组中的赋值,再数组索引[index]
1、临时变量
2、解构赋值
3、加减法交换
4、位运算符
5、对象赋值
6、数组赋值
其中加减法交换、位运算符 只能交换整数