慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
異或運算 XOR 教程
阮一峰 · 2021-01-27 · via 阮一峰的网络日志

大家比較熟悉的邏輯運算,主要是"與運算"(AND)和"或運算"(OR),還有一種"異或運算"(XOR),也非常重要。

本文介紹異或運算的含義和應用。

一、含義

XOR 是 exclusive OR 的縮寫。英語的 exclusive 意思是"專有的,獨有的",可以理解為 XOR 是更單純的 OR 運算。

我們知道,OR 運算的運算子有兩種情況,計算結果為true

(1)一個為 true,另一個為 false;

(2)兩個都為 true。

上面兩種情況,有時候需要明確區分,所以引入了 XOR。

XOR 排除了第二種情況,只有第一種情況(一個運算子為true,另一個為false)才會返回 true,所以可以看成是更單純的 OR 運算。也就是說, XOR 主要用來判斷兩個值是否不同。

XOR 一般使用插入符號(caret)^表示。如果約定0 為 false,1 為 true,那麼 XOR 的運算真值表如下。


0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

二、運算定律

XOR 運算有以下的運算定律。由於非常簡單,這裡就省略證明了。

(1)一個值與自身的運算,總是為 false。


x ^ x = 0

(2)一個值與 0 的運算,總是等於其本身。


x ^ 0 = x

(3)可交換性


 x ^ y = y ^ x

(4)結合性


x ^ (y ^ z) = (x ^ y) ^ z

三、應用

根據上面的這些運算定律,可以得到異或運算的很多重要應用。

3.1 簡化計算

多個值的異或運算,可以根據運算定律進行簡化。


a ^ b ^ c ^ a ^ b
= a ^ a ^ b ^ b ^ c
= 0 ^ 0 ^ c
= c

3.2 交換值

兩個變量連續進行三次異或運算,可以互相交換值。

假設兩個變量是xy,各自的值是ab。下面就是xy進行三次異或運算,註釋部分是每次運算後兩個變量的值。


x = x ^ y // (a ^ b, b)
y = x ^ y // (a ^ b, a ^ b ^ b) => (a ^ b, a)
x = x ^ y // (a ^ b ^ a, a) => (b, a)

這是兩個變量交換值的最快方法,不需要任何額外的空間。

3.3 加密

異或運算可以用於加密。

第一步,明文(text)與密鑰(key)進行異或運算,可以得到密文(cipherText)。


text ^ key = cipherText

第二步,密文與密鑰再次進行異或運算,就可以還原成明文。


cipherText ^ key = text

原理很簡單,如果明文是 x,密鑰是 y,那麼 x 連續與 y 進行兩次異或運算,得到自身。


(x ^ y) ^ y
= x ^ (y ^ y)
= x ^ 0
= x

3.4 數據備份

異或運算可以用於數據備份。

文件 x 和文件 y 進行異或運算,產生一個備份文件 z。


x ^ y = z

以後,無論是文件 x 或文件 y 損壞,只要不是兩個原始文件同時損壞,就能根據另一個文件和備份文件,進行還原。


x ^ z
= x ^ (x ^ y) 
= (x ^ x) ^ y
= 0 ^ y
= y

上面的例子是 y 損壞,x 和 z 進行異或運算,就能得到 y。

四、一道面試題

一些面試的算法題,也能使用異或運算快速求解。

請看下面這道題。

一個數組包含 n-1 個成員,這些成員是 1 到 n 之間的整數,且沒有重複,請找出缺少的那個數字。

最快的解答方法,就是把所有數組成員(A[0] 一直到 A[n-2])與 1 到 n 的整數全部放在一起,進行異或運算。


A[0] ^ A[1] ^ ... ^ A[n-2] ^ 1 ^ 2 ^ ... ^ n

上面這個式子中,每個數組成員都會出現兩次,相同的值進行異或運算就會得到 0。只有缺少的那個數字出現一次,所以最後得到的就是這個值。

你可能想到了,加法也可以解這道題。


1 + 2 +  ... + n - A[0] - A[1] - ... - A[n-2]

但是,加法的速度沒有異或運算快,而且需要額外的空間。如果數字比較大,還有溢出的可能。

下面是一道類似的題目,大家可以作為練習。

一個數組包含 n+1 個成員,這些成員是 1 到 n 之間的整數。只有一個成員出現了兩次,其他成員都只出現一次,請找出重複出現的那個數字。

五、參考鏈接

(完)