当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0,简单的说就是-----相同为 0,不同为 1
语法:result = expression1 ^ expression2
按位异或 是对两个表达式执行 按位异或,先将两个数据转化为二进制数,然后进行 按位异或运算,只要位不同结果为 1,否则结果为 0
例如:
let a = 5;
let b = 8;
let c = a ^ b;
console.log(c) // 13
解析:
a 转二进制数为:0101
b 转二进制数为:1000
那么按照 按位异或 运算之后得到:1101(相同为 0,不同为 1),得到 c 的值就是 13
特点
一、满足交换率
abc === cba === bac
二、两个相同的数字异或操作得到的一定是 0
a^a === 0
三、0 和
其他数字
异或操作得到的一定是其他数字
0^a === a
常见场景
一、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
let arr = [1, 3, 1, 2, 2, 7, 3, 6, 7]
// es5 解决方案
function fnc(arr){
let result = 0;
for(let i = 0; i < arr.length; i++){
result = result ^ arr[i];
}
return result;
}
// es6 解决方案
function fnc(arr){
return arr.reduce((a, b) => a ^ b, 0);
}
二、两个数相加不使用四则运算得出和
function sum(a, b){
if(a == 0) return b;
if(b == 0) return a;
let newA = a ^ b;
let newB = (a & b) << 1;
return sum (newA, newB);
}
网友评论