之前上学的时候学习的知识,很多时候在工作中没有使用就完全忘完了,最近开始刷leetCode,就发现这个异或运算,就重新复习了一下
在二进制中,存在异或 ^ 操作,也就是位数值相同的为0,位数值相异的为1,也就是
1.交换律:a ^ b ^ c <=> a ^ c ^ b
2.任何数于0异或为任何数 0 ^ n => n
3.相同的数异或为0: n ^ n => 0
我们先来看看我刷到的这个leetcode题:
在此可以复习一下,十进制转二进制互转方法(只讲整数,其余的小数、负数可以自行百度):
十进制整数42转二进制
采用"除2取余,逆序排列"法:
- 首先用2整除十进制整数,得到一个商和余数
- 然后再用2去除得到的商,又会得到一个商和余数
- 重复操作,一直到商为小于1时为止
- 然后将得到的所有余数全部排列起来,再将它反过来(逆序排列),切记一定要反过来!
二进制101010转十进制:
abcd = d * 20 + c * 21 + b * 22 + a * 23
因此,利用异或运算:
let a = 1 ^ 2
console.log(a); // 3
//3
//1 -> 01
//2 -> 10
//1 ^ 2 -> 11 -> 3
因此在该题目中,数组中重复的数据都是偶数的情况下,用异或运算符可以抵消掉为0,奇数的数据就会留下来
所以,上题的解答可以为:
function singleNumber(nums: number[]): number {
let result: number = 0;
for(let i = 0; i < nums.length; i++) {
result = result ^ nums[i];
}
return result;
};
console.log(singleNumber([4,1,2,1,2])); // 4
// 过程为:
// 1 ^ 1 ^ 2 ^ 2 ^ 4 = 0 ^ 0 ^ 4 = 4