인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

博客园 - 司徒正美
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 연산의 의미와 응용을 소개합니다.

1. 의미

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

이.2. 연산 법칙

XOR 연산은 다음과 같은 연산 법칙을 가집니다. 매우 간단하기 때문에 여기서는 증명을 생략합니다.

(1) 하나의 값과 자기 자신의 연산은 항상 false입니다.


x ^ x = 0

(2) 하나의 값과 0의 연산은 항상 자기 자신과 같습니다.


x ^ 0 = x

(3) 교환 법칙


 x ^ y = y ^ x

(4) 결합 법칙


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

세 번째, 응용

위의 연산 법칙을 바탕으로 XOR 연산의 많은 중요한 응용을 얻을 수 있습니다.

3.1 계산 단순화

여러 값의 XOR 연산은 연산 법칙을 통해 단순화할 수 있습니다.


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

3.2 값 교환

두 변수를 연속으로 세 번 XOR 연산을 하면 값이 서로 교환됩니다.

두 변수가 xy 라고 가정하고, 각각의 값이 ab 이라고 합니다. 아래는 xy 이 세 번의 XOR 연산을 수행하는 과정으로, 주석 부분은 각 연산 후 두 변수의 값입니다.


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 암호화

XOR 연산은 암호화에 사용될 수 있습니다.

첫 번째 단계, 평문(text)과 키(key)를 XOR 연산하면 암호문(cipherText)을 얻을 수 있습니다.


text ^ key = cipherText

두 번째 단계, 암호문과 키를 다시 XOR 연산하면 평문으로 원래의 내용을 복원할 수 있습니다.


cipherText ^ key = text

원리는 간단합니다. 평문이 x이고 키가 y라면, x가 y와 연속해서 두 번 XOR 연산을 하면 자기 자신이 됩니다.


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

3.4 데이터 백업

XOR 연산은 데이터 백업에 사용할 수 있습니다.

파일 x와 파일 y를 XOR 연산하여 백업 파일 z를 생성합니다.


x ^ y = z

그 후, 파일 x 또는 파일 y가 손상되더라도 두 원본 파일이 동시에 손상되지 않는 한 다른 파일과 백업 파일을 통해 복원할 수 있습니다.


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

위 식에서 배열의 각 멤버는 두 번 나타납니다. 같은 값의 멤버들을 배타적 논리곱하면 0이 됩니다. 빠진 숫자는 한 번만 나타나므로, 마지막으로 얻는 값이 바로 이 값입니다.

당신은 덧셈으로도 이 문제를 풀 수 있다는 것을 생각해 볼 수 있을 것입니다.


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

하지만 덧셈은 배타적 논리곱보다 느리며, 추가적인 공간이 필요합니다. 숫자가 크다면 오버플로우가 발생할 수 있습니다.

아래는 유사한 문제로, 연습을 위해 참고해 보세요.

배열에는 n+1개의 멤버가 포함되어 있으며, 이 멤버들은 1부터 n까지의 정수입니다. 하나의 멤버는 두 번 나타나고 다른 멤버들은 한 번만 나타납니다. 반복되는 멤버를 찾아보세요.

5. 참고 링크

(끝)