理解异或运算^

异或使用场景
在冒泡排序中,会使用到一个swap方法,用作交换两个值,有时会为了节省一个变量,直接使用下面的代码操作两个值的交换:

const arr = [1, 8, 6, 5, 7, 1];
function bubbleSort() {
  for (let e = arr.length - 1; e > 0; e--) {
    for (let i = 0; i < e; i++) {
      if (arr[i] > arr[i + 1]) {
        swap(arr, i, i + 1)
      }
    }
  }
}
// 交换2个值
function swap(arr, i, j) {
  arr[i] = arr[i] ^ arr[j];
  arr[j] = arr[i] ^ arr[j];
  arr[i] = arr[i] ^ arr[j];
}

bubbleSort()
console.log(arr);

那么swap方法到底是如何交换值的呢?容我们慢慢揭开她的面纱
运算规则
首先我们要了解异或运算: ^
异或运算的规则是:相同为0,不同为1

// a  ^  b  =
  0  ^   0 = 0
  0  ^   1 = 1
  1  ^   0 = 1
  1  ^   1 = 0

两个数异或运算,规则一样:

  1001
^ 1000
= 0001 

因此,异或运算,我们可以理解为无进位相加。正常情况1+1要向前进一位,异或运算就是无进位的加法运算。

异或运算的特点

  1. 0 ^ N = N
  2. N ^ N = 0
  3. 交换性: a^b = b ^a
  4. 结核性: a^b^c=a^(b^c)

解析
通过上面介绍异或运算的特点,我们假设:

a = 甲
b = 乙
a = a ^ b; 翻译为:a = 甲 ^ 乙

b = a ^ b; 翻译为:b = 甲 ^ 乙 ^ 乙;翻译为:甲 ^ (乙 ^ 乙);根据上述的特点2,可以得出乙 ^ 乙为0;
即:甲 ^ 0;根据特点1,得出:b = 甲;

a = a ^ b;翻译为:a = 甲 ^ 乙 ^ 甲;翻译为: (甲 ^ 甲) ^ 乙;根据特点1、2,得出a = 乙

TypeScript复制代码

//Q 1、3、77 出现了2次(偶数次);3出现了1次,奇数次;求这个3
const arr = [1,1,2,3,3,77,77]

// A:
const arr = [1,1,2,2,3,3,4,5,5]
let result = 0;
for (let i in arr) {
  result ^= arr[i]
}
console.log('result',result) // 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值