面试官: “请说说 js交换两变量的值 有哪些方案”

104 阅读2分钟

异或位运算符算法

aba^b
000
110
011
101

总结来说就是: 相同就是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

这样在控制台打印一下ab的输出

可以看到 ab 的值如下:
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 = 3b = a ^ b = 3 ^ 2
  3换算成二进制 等于 11
  2换算成二进制 等于 10
  
  11
  10
= 01

01 是1的二进制

∴ b = 1a = 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、数组赋值

其中加减法交换位运算符 只能交换整数