接单网站设计 只做设计图报价什么是营销渠道
let a = 18 // 甲
let b = 20 // 乙a = a ^ b
b = a ^ b
a = a ^ b console.log("a=",a) // a = 20
console.log("b=",b) // b = 18
今天我们就研究上面这一段代码,简单解释一下,初始化一个a = 18 b = 20, 中间经过了三次的异或之后,a 和 b的值就完成了交换,中间的原因我们今天研究一下
首先异或是一种位运算,元算规则可以简单的理解为,相同为0,不同为1 所以也可以简单的理解为不进位的二进制运算
console.log(0 ^ 1) // 1
console.log(0 ^ 0) // 0
console.log(1 ^ 1) // 0
console.log(1 ^ 0) // 1
console.log(1 ^ 0 ^ 0) // 1
上面的规律我们可以简单的总结一下:
- 规则1: 0 异或任何值 都是非0本身
- 规则2: 任意相同的两个值进行异或,均为0
- 规则3: 异或的两个值不会随着位置变化而对结果产品变化 所以他满足交换律和结合律
这个时候我们重新看开始的那段代码可以理解为下面的解释
// 假设 a = 甲 b = 乙
a = a ^ b // a = 甲 ^ 乙 b = 乙
b = a ^ b // b = 甲 ^ 乙 ^ 乙 b = 甲
a = a ^ b // a = 甲 ^ 乙 ^ 甲 a = 乙
// 最后 a = 乙 b = 甲 自然得到了 a = 20 b = 18
当然上面的数据需要满足一个前提条件,异或属于位运算,所以参与运算的数据必须是不同位置的才可以,计算机中不同的位置对应的就是不同的内存地址,相同地址就没有位元算的意义了。但是因为js定义变量都是独立的内存位置,所以js中基本上不存在这种公用一个位置的变量,但是c和java这种就不一定了,所以用来交换的时候慎用!!!
给枯燥无味的业务代码添加一点乐趣