异或运算符(^)

3 阅读2分钟

异或运算符(^)是一种位运算符,其核心逻辑为“相同为 0,不同为 1”。在 JavaScript 中,它广泛应用于数值计算、数据加密、算法优化等领域。

定义与规则

核心规则为:相同为0,不同为1。具体表现为:

  • 二进制位比较
    • 若两个操作数的对应位相同,结果为0;不同则为1。
    • 示例:5 ^ 3(二进制0101 ^ 0011)结果为0110(十进制6)。
  • 真值表
输入A输入B输出A ^ B
000
011
101
110

核心特性

  1. 交换律a ^ b = b ^ a
  2. 结合律(a ^ b) ^ c = a ^ (b ^ c)
  3. 自反性a ^ b ^ a = b(两次异或同一值可还原原值)。
  4. 恒等律a ^ 0 = a,任何数与0异或结果不变。
  5. 归零律a ^ a = 0,相同数异或结果为0。

JavaScript 中的异或运算

交换变量值

无需临时变量,通过三次异或操作交换两个整数:

let a = 5, b = 10;
a = a ^ b; // a = 15 (二进制 1111)
b = a ^ b; // b = 5 (1111 ^ 1010 = 0101)
a = a ^ b; // a = 10 (1111 ^ 0101 = 1010)

注意:若交换同一变量(如数组索引重复),结果会归零。

检测奇偶性

利用二进制最低位判断奇偶:

function isOdd(num) {
  return (num ^ 1) !== 0; // 奇数返回true,偶数返回false
}

原理:奇数二进制末位为1,与1异或结果为0则偶数,否则奇数。

查找唯一出现奇数次数的元素

在数组中,若某元素仅出现奇数次,其他均出现偶数次,可通过异或快速定位:

function findSingle(arr) {
  return arr.reduce((acc, num) => acc ^ num, 0);
}
// 示例:findSingle([4, 1, 2, 2, 3, 1, 4]) 返回3

原理:偶数次出现的元素异或后相互抵消,最终保留奇数次元素。

简单数据加密与解密

通过异或同一密钥实现对称加密:

function xorEncrypt(str, key) {
  return str.split('').map(c => c.charCodeAt(0) ^ key).join(',');
}
function xorDecrypt(encrypted, key) {
  return encrypted.split(',').map(n => String.fromCharCode(n ^ key)).join('');
}
// 示例:xorEncrypt('Hello', 123) -> "加密结果"; xorDecrypt(加密结果, 123) -> "Hello"

特点:加密解密使用相同密钥,但安全性较低,需结合其他算法增强。