算法篇:位运算异或的使用(一)

时间:2022-07-25
本文章向大家介绍算法篇:位运算异或的使用(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

算法:

在位运算中,运用最多的便是异或操作^,规则如下所示:

1.a^a = 0 ,a^0 = a,
2.a^b^a= a^a^b = 0^b = b
备注:下面的两个题目是单纯使用异或操作的题目,一种是最基本的异或操作,
一种是稍作转换就可以完成的变形题目。

题目1: 异或的基本使用

https://leetcode-cn.com/problems/single-number/

代码实现:

func singleNumber(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    res := 0
    for _,v := range nums{
        res ^= v
    }
    return res
}
// 算法:
// 利用位运算,异或的使用,a^a = 0 ,a^0 = a,
// 因为题目是两个数,和一个数,属于^的完美使用范畴,
// 由公式:a^b^a= a^a^b = 0^b = b,可以直接将代码取异或操作,
//结果就是那个个数为1的数

执行结果:

题目2: 异或的变形题目

https://leetcode-cn.com/problems/single-number-iii/

代码实现:

func singleNumber(nums []int) []int {
    if len(nums) == 0 {
        return nil
    }
    // step1:抵消掉数量为2的数
    tmp:= 0
    for _,v:=range nums{
        tmp ^= v
    }
    // step2:找出来第一个为1的bit位
    i:=0
    for {
       n := 1<<i 
       if tmp&n != 0 {
           break
       }
       i++
    }
    // step3:按照bit=1来将数组分成两组,然后分别计算这两组的异或值,也就是这两个数
    a,b := 0,0
    test := 1<<i
    for _,n := range nums {
        if n & test == 0{
            a^=n
        } else {
            b^=n
        }
    }
    return []int{a,b}
}
// 算法:属于异或的延伸题目
// 因为有两个数字个数是1,其他都是两个,所以要使用异或,
// 大体思路是将包含两个一个的数组变成2个分别包含一个个数是1的数组里面,将题目转换成题目1的做法
// 算法分为三步: 
// step1:通过异或,最终获取这两个数字的异或结果a^b=0xiiiii, 
// 这里只要是bit!=0,就说明这一个bit位在a,b两个数中不相同,我们就从低位开始找,找到第一个为1的bit位即可。
// step2:找到这个bit位置
// step3:遍历数组,将数组中该bit==1的元素放入数组A,bit==0的放入数组B,
// 分别计算A,B就可以得到这两个数。

执行结果: