异或运算
运算规律
相同为0,不同为1
举例说明:有两个二进制数,分别为a
和b
,他们两个异或计算。
10110^00111=10001
一个值于0异或,都是这个数
a^0=a
任何数跟自己异或,都为0
a^a=0
满足交换律和结合律
(a ^ b) ^ c = a ^ (b ^ c)
两值交换
let a = 5;
let b = 10;
// 值交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a=>', a)
console.log('b=>', b)
1. a = a ^ b; 此时: a = a ^ b; b = 10;
2.b = a ^ b; 此时:b = a ^ b ^ b。根据上边的规律,【任何数跟自己异或为0】得到: b = a ^ 0根据规律,进而得到 b = a。
3.a=(a ^ b) ^ (a ^ b ^ b)=a^b^a=b
有一个数组,只有一种数出现了奇数次,其它所有树出现了偶数次,怎么找出出现奇数次的这个数?
const a = [2,3,4,5,6,5,5,6,4,3,2];
// 输出奇数
number = 5;
我们通过异或运算,代码如下
const arr = [2,3,4,5,6,5,5,6,4,3,2];
let number = arr[0];
for (var i = 1; i < arr.length; i ++) {
number = number ^ arr[i]
}
console.log('number=>', number);
我们把数组中的每个数都进行异或运算,就会得出奇数次出现的那个数。
简单加解密
我们有明文text,秘钥key,进行异或运算得到密文cipher
加密
const cipher = text ^ key;
解密
const text = cipher ^ key;
const cipher = text ^ key;
const text = (text ^ key) ^ key;