讲讲异或 #良心超明白介绍 #记住我 #没错,又是我搞事情

异或运算详解
本文深入讲解了异或运算的基本概念,包括其运算规则、特点及应用。如利用异或进行位翻转、值交换和相等判断,以及异或运算在编程中的巧妙使用。

异或

傻逼 博主在刚学的时候,看到别人的代码一堆异或
死的和任何一位萌新一样
而且,耂是背了忘,忘了背,背了又忘
所以,想写篇博客,骗点赞 加深印象

异或:
符号:
⊕ , xor , ^ , eor ,ex-or 都指异或
概念:
一种二进制的位运算
针对一个数转化成二进制后的数的 每一位 进行 运算
法则:
这是一个全靠背(博主感觉)的东西
0^0=0
1^1=0
1^0=1
0^1=1

就是相同为假,不同为真
几个特点和功能:
1. 0异或任何数=任何数本身
2. 1异或任何数=任何数取反(针对每一二进制位取反)这一点博主在某些大佬的程序中看懵了好几次,现在自己也喜欢这样写,让某些 陈琦(my gay friend) 刚学的孩子 看不懂
3. 任何数异或她自己=把她自己变成0
4. 使一个数某些特定的位翻转
  例如对二进制数 11001 的第2位和第3位翻转,我们则可以将这个数与 00110 进行按位异或运算
  11001^00110=11111
  这很重要:一个数与另一个数进行位运算时,不足的位 补零 上去
5. 交换两个值,而不是用临时变量
这可以用来让陈琦看不懂
代码:cpp
交换 A B

void change(int& a,int& b)
{
	a=a^b;
	b=b^a;
	a=a^b;
 } 
  1. 似乎上面数字没对齐
    没事,我就是来坑强迫症的
    判断两个数是否相等,但是这种较快,较装B
    代码:cpp
bool check(int a,int b)
{
	return ((a^b==0));
}
//return 1:相等
//return 0:不等 

好了 ,介绍完了,可以点个赞吗
 谢谢阅读
 #点赞是我写BUG的动力!!!

前缀异或(Prefix XOR)是一种与**前缀和**类似的思想,用于高效处理组上的**区间异或查询**问题。它利用了异或运算的特殊性质,可以在 $ O(1) $ 时间内回答任意区间的异或结果,前提是预处理出一个“前缀异或组”。 --- ### ✅ 什么是前缀异或? 定义: 对于一个组 `a[0..n-1]`,其**前缀异或组** `prefix[0..n]` 定义如下: ```cpp prefix[0] = 0 prefix[1] = a[0] prefix[2] = a[0] ^ a[1] prefix[3] = a[0] ^ a[1] ^ a[2] ... prefix[i] = a[0] ^ a[1] ^ ... ^ a[i-1] ``` 即: $$ \text{prefix}[i] = \bigoplus_{k=0}^{i-1} a[k] $$ 我们约定 `prefix[0] = 0`,这样可以方便地处理从下标 0 开始的区间。 --- ### ✅ 核心公式:如何用前缀异或求区间异或? 要计算区间 `[l, r]` 内所有元素的异或值: $$ \text{xor}(l, r) = a[l] \oplus a[l+1] \oplus \cdots \oplus a[r] $$ 使用前缀异或可以快速得到: $$ \text{xor}(l, r) = \text{prefix}[r+1] \oplus \text{prefix}[l] $$ #### 🔍 原理推导: 因为: - `prefix[r+1] = a[0]^a[1]^...^a[r]` - `prefix[l] = a[0]^a[1]^...^a[l-1]` 两者异或时,前面重复的部分会抵消(因为 $ x \oplus x = 0 $),剩下就是 `[l, r]` 的异或: $$ \text{prefix}[r+1] \oplus \text{prefix}[l] = (a[0]\oplus...\oplus a[l-1]\oplus a[l]\oplus...\oplus a[r]) \oplus (a[0]\oplus...\oplus a[l-1]) = a[l]\oplus...\oplus a[r] $$ ✅ 所以只需要一次异或操作即可得到答案! --- ### ✅ 示例说明 组:`a = [1, 2, 3, 4]` | i | a[i] | prefix[i](含义) | |--|------|------------------| | 0 | - | prefix[0] = 0 | | 1 | 1 | prefix[1] = 0^1 = 1 | | 2 | 2 | prefix[2] = 1^2 = 3 | | 3 | 3 | prefix[3] = 3^3 = 0 | | 4 | 4 | prefix[4] = 0^4 = 4 | 现在查询 `[1, 3]`(即 `a[1]^a[2]^a[3] = 2^3^4 = 5`) 使用公式: $$ \text{xor}(1,3) = \text{prefix}[4] \oplus \text{prefix}[1] = 4 \oplus 1 = 5 ✔️ $$ --- ### ✅ 代码实现(完整带注释) ```cpp #include <iostream> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } // 构建前缀异或组,长度为 n+1 vector<int> prefix(n + 1, 0); for (int i = 0; i < n; ++i) { prefix[i + 1] = prefix[i] ^ a[i]; } int m; cin >> m; // 查询次 while (m--) { int l, r; cin >> l >> r; // 如果输入是 1-indexed,则转换为 0-indexed l--; r--; // 计算区间 [l, r] 的异或值 int res = prefix[r + 1] ^ prefix[l]; cout << res << &#39;\n&#39;; } return 0; } ``` --- ### ✅ 前缀异或 vs 前缀和 | 特性 | 前缀和 | 前缀异或 | |------|--------|-----------| | 运算 | 加法 `+` | 异或 `^` | | 逆运算 | 减法 `-` | 异或本身(自反) | | 区间和 | `sum[r] - sum[l]` | `prefix[r+1] ^ prefix[l]` | | 是否支持修改 | 不支持(需树状组/线段树) | 同样不支持动态修改 | | 典型应用 | 区间求和 | 找出现奇次的、加密、校验等 | > ⚠️ 注意:异或没有“负”概念,但因为它满足 $ a \oplus a = 0 $,所以自己就是自己的逆运算。 --- ### ✅ 实际应用场景 1. **找唯一出现奇次的字** - 组中只有一个出现奇次,其余都出现偶次 → 整体异或即可得答案。 2. **加密与解密** - 异或具有可逆性:`a ^ b ^ b = a`,常用于简单加解密。 3. **据校验(CRC、哈希)** - 快速生成校验码。 4. **LeetCode 题目** - 如 [LC1310. 子异或查询](https://leetcode.cn/problems/xor-queries-of-a-subarray/) 就是典型前缀异或题。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值