10.03_按位异或

按位异或

问题描述

按位异或运算(^)是一种基本的位运算,当两个位不同时结果为1,相同时为0。常用于数字加密、交换数字等场景。
性质:任何数异或自身等于0,当x,y为正整数时,abs(x-y)<=x^y<=x+y。

基本操作

算法思想

  1. 两个位不同时结果为1
  2. 可用于无临时变量交换
  3. 适用于成对数字查找
  4. 时间复杂度

代码实现

class Solution {
public:
    // 交换两个数
    void swap(int& a, int& b) {
        a ^= b;
        b ^= a;
        a ^= b;
    }
    
    // 查找只出现一次的数
    int findSingle(vector<int>& nums) {
        int result = 0;
        for (int num : nums) {
            result ^= num;
        }
        return result;
    }
    
    // 判断两个数是否相等
    bool isEqual(int a, int b) {
        return (a ^ b) == 0;
    }
    
    // 翻转特定位
    int flipBit(int x, int pos) {
        return x ^ (1 << pos);
    }
};
class Solution {
    // 交换两个数
    public void swap(int[] nums, int i, int j) {
        nums[i] ^= nums[j];
        nums[j] ^= nums[i];
        nums[i] ^= nums[j];
    }
    
    // 查找只出现一次的数
    public int findSingle(int[] nums) {
        int result = 0;
        for (int num : nums) {
            result ^= num;
        }
        return result;
    }
    
    // 判断两个数是否相等
    public boolean isEqual(int a, int b) {
        return (a ^ b) == 0;
    }
    
    // 翻转特定位
    public int flipBit(int x, int pos) {
        return x ^ (1 << pos);
    }
}
class Solution:
    # 交换两个数
    def swap(self, nums: List[int], i: int, j: int) -> None:
        nums[i] ^= nums[j]
        nums[j] ^= nums[i]
        nums[i] ^= nums[j]
    
    # 查找只出现一次的数
    def findSingle(self, nums: List[int]) -> int:
        result = 0
        for num in nums:
            result ^= num
        return result
    
    # 判断两个数是否相等
    def isEqual(self, a: int, b: int) -> bool:
        return (a ^ b) == 0
    
    # 翻转特定位
    def flipBit(self, x: int, pos: int) -> int:
        return x ^ (1 << pos)

时间复杂度分析

操作 时间复杂度 空间复杂度
基本异或
数字交换
查找单数
位翻转

应用场景

  1. 数字加密
  2. 无临时变量交换
  3. 查找单一元素
  4. 校验和计算
  5. 位状态翻转

注意事项

  1. 运算优先级
  2. 自身异或注意
  3. 溢出处理
  4. 位数限制
  5. 性能优化

常见变形

  1. 数字加密
class Solution {
public:
    // 加密
    int encrypt(int data, int key) {
        return data ^ key;
    }
    
    // 解密
    int decrypt(int encrypted, int key) {
        return encrypted ^ key;  // 异或两次恢复原值
    }
    
    // 批量加密
    vector<int> encryptArray(vector<int>& data, int key) {
        vector<int> result = data;
        for (int& x : result) {
            x ^= key;
        }
        return result;
    }
};
class Solution {
    // 加密
    public int encrypt(int data, int key) {
        return data ^ key;
    }
    
    // 解密
    public int decrypt(int encrypted, int key) {
        return encrypted ^ key;  // 异或两次恢复原值
    }
    
    // 批量加密
    public int[] encryptArray(int[] data, int key) {
        int[] result = data.clone();
        for (int i = 0; i < result.length; i++) {
            result[i] ^= key;
        }
        return result;
    }
}
class Solution:
    # 加密
    def encrypt(self, data: int, key: int) -> int:
        return data ^ key
    
    # 解密
    def decrypt(self, encrypted: int, key: int) -> int:
        return encrypted ^ key  # 异或两次恢复原值
    
    # 批量加密
    def encryptArray(self, data: List[int], key: int) -> List[int]:
        return [x ^ key for x in data]
  1. 查找成对数字
class Solution {
public:
    // 查找出现奇数次的数字
    vector<int> findOddOccurrence(vector<int>& nums) {
        int xorSum = 0;
        for (int num : nums) {
            xorSum ^= num;
        }
        
        // 找到最右边的1
        int rightmostBit = xorSum & -xorSum;
        
        vector<int> result(2);
        for (int num : nums) {
            if (num & rightmostBit) {
                result[0] ^= num;
            } else {
                result[1] ^= num;
            }
        }
        return result;
    }
};
class Solution {
    // 查找出现奇数次的数字
    public int[] findOddOccurrence(int[] nums) {
        int xorSum = 0;
        for (int num : nums) {
            xorSum ^= num;
        }
        
        // 找到最右边的1
        int rightmostBit = xorSum & -xorSum;
        
        int[] result = new int[2];
        for (int num : nums) {
            if ((num & rightmostBit) != 0) {
                result[0] ^= num;
            } else {
                result[1] ^= num;
            }
        }
        return result;
    }
}
class Solution:
    # 查找出现奇数次的数字
    def findOddOccurrence(self, nums: List[int]) -> List[int]:
        xor_sum = 0
        for num in nums:
            xor_sum ^= num
        
        # 找到最右边的1
        rightmost_bit = xor_sum & -xor_sum
        
        result = [0, 0]
        for num in nums:
            if num & rightmost_bit:
                result[0] ^= num
            else:
                result[1] ^= num
        return result

经典例题

  1. 小红吃药
牛客代码笔记-牛栋 文章被收录于专栏

汗牛充栋,学海无涯。<br/> 内含算法知识点讲解,以及牛客题库精选例题。<br/> 学习算法,从牛栋开始。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务