慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

博客园 - 司徒正美
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と2回連続で排他的論理和(XOR)を行うと、x自身が得られます。


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

3.4 データバックアップ

排他的論理和はデータバックアップに利用できます。

ファイルxとファイルyを排他的論理和(XOR)すると、バックアップファイルzが生成されます。


x ^ y = z

その後、ファイルxやファイルyが破損したとしても、2つの元のファイルが同時に破損していない限り、もう一方のファイルとバックアップファイルを使って復元できます。


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

上記の例ではyが破損した場合、xとzを排他的論理和(XOR)することでyを得られます。

四、面接問題

いくつかの面接のアルゴリズム問題も、排他的論理和(XOR)を使って素早く解くことができます。

以下の問題をご覧ください。

配列には n-1 個の要素があり、これらは 1 から n の整数で、重複していない。欠けている数字を見つけ出してください。

最も速い解決方法は、すべての配列要素(A[0] から A[n-2])と 1 から n の整数をすべて合わせて、排他的論理和(XOR)を行うことです。


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

上記の式では、各配列要素は 2 回出現します。同じ値の排他的論理和を行うと 0 になります。欠けている数字は 1 回だけ出現するので、最終的に得られるのがその値です。

排他的論理和以外にも、加算でこの問題を解く方法を思いつくかもしれません。


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

しかし、加算は排他的論理和よりも遅く、追加のメモリが必要です。数字が大きい場合、オーバーフローする可能性もあります。

次は似たような問題を出題します。練習として解いてみてください。

配列には n+1 個の要素があり、これらは 1 から n の整数です。ただし、1 つの要素は 2 回出現し、他の要素は 1 回だけ出現します。重複している要素を見つけ出してください。

五、参照リンク

(終)