- XOR는 두 비트가 서로 다를 때 1이 되는 연산으로, 배타적 OR·같지 않음·조건부 반전·mod 2 덧셈/뺄셈을 하나의 동작으로 연결해 이해할 수 있음
- 정수에 대한 비트 단위 XOR는 각 자리를 독립적으로 처리해 비트별 차이를 드러내고, 자리올림 없는 이진 덧셈처럼 동작하면서 교환법칙·결합법칙·0 항등원·자기 역원 성질을 유지함
- 암호에서는 평문과 키스트림을 결합하는 데 쓰이고, 과거 픽셀 그래픽에서는 같은 그림을 다시 그려 지우는 방식으로 메모리와 CPU 부담을 줄였음
- 반가산기 항등식, 비트 교환, 세 번의 XOR 스왑, Nim 게임의 승리 조건처럼 차이를 만들고 다시 상쇄하는 계산에서 XOR의 성질이 직접 활용됨
- 집합의 대칭차, 지수 2인 군, nim-sum, GF(2) 위 선형대수와 다항식까지 이어지며 Hamming 코드·CRC·AES·GCM·Classic McEliece 같은 오류 검출·정정 및 암호 기법과도 연결됨
XOR의 기본 의미
- XOR는 두 입력 비트와 하나의 출력 비트를 갖는 불리언 연산이며, 진리표는
00→0,01→1,10→1,11→0임 - “exclusive OR”로 보면 두 입력 중 하나만 참일 때 1이고, 둘 다 참이면 0임
- “not equals”로 보면
a XOR b는a ≠ b와 같아 두 불리언 값이 다를 때 1을 냄 - 조건부 반전으로 보면
a=0일 때b를 그대로 두고,a=1일 때b를 뒤집음- 같은 이유로
b를 제어 입력으로 보고a를 뒤집는 해석도 가능함
- 같은 이유로
- 패리티 관점에서는 입력 중 1의 개수가 홀수인지 알려줌
- 두 비트에서는
a+b mod 2와 같음 a-b mod 2와도 같음- 여러 값을 XOR하면 전체 입력 중 1의 개수가 홀수인지 짝수인지 알 수 있음
- 두 비트에서는
XOR의 대수적 성질
- XOR는 교환법칙과 결합법칙을 만족함
a XOR b = b XOR a(a XOR b) XOR c = a XOR (b XOR c)- 긴 XOR 목록에서는 순서와 묶는 방식이 결과에 영향을 주지 않음
- 0은 XOR의 항등원임
a XOR 0 = 0 XOR a = a- 긴 XOR 목록에서 0은 제거해도 됨
- 모든 값은 자기 자신에 대한 역원임
a XOR a = 0- 같은 변수가 두 번 나오면 두 항을 함께 제거할 수 있음
(a XOR b) XOR b = a처럼 이미 섞인 값에서 알고 있는 항을 한 번 더 XOR해 제거할 수 있음
정수에 대한 비트 단위 XOR
- 정수의 비트 단위 XOR는 두 정수를 이진수로 놓고 각 자리의 비트를 독립적으로 XOR함
- 단일 비트 XOR의 성질은 정수에도 그대로 적용됨
a XOR b = b XOR a(a XOR b) XOR c = a XOR (b XOR c)a XOR 0 = aa XOR a = 0
- 비트 단위 XOR는 두 정수의 비트별 차이를 알려줌
a=b이면a XOR b = 0a≠b이면 적어도 한 비트가 달라a XOR b ≠ 0- 결과값의 1 비트들은 두 입력이 서로 다른 위치를 나타냄
- 비트 단위 XOR는 조건부 비트 반전기로도 볼 수 있음
- 제어값의 1 비트 위치에서만 데이터 비트를 뒤집음
- ASCII와 일부 후속 인코딩에서는 라틴 대문자와 소문자가 한 비트만 달라, 문자 값에 32를 XOR하면 대소문자를 바꿀 수 있음
- 이 규칙은 모든 Unicode 문자에 적용되지 않으며, 대소문자 개념이 없거나 규칙을 따르지 않는 문자도 많음
- 비트 단위 XOR는 자리올림 없는 이진 덧셈과 같음
- 각 자리에서만 mod 2 덧셈을 하고 다음 자리로 자리올림을 전달하지 않음
암호에서의 XOR
- 암호에서는 평문과 같은 길이의 키스트림을 만들고, 평문 바이트나 워드와 키스트림을 결합해 암호문을 만드는 방식이 쓰임
- 이 결합 단계에는 XOR가 일반적으로 사용됨
- 수신자는 같은 키스트림을 다시 XOR해 원래 평문을 복원할 수 있음
- 송신자와 수신자가 같은 연산을 쓴다는 점도 약간 더 편리함
- 키스트림 자체를 만드는 방식은 더 복잡할 수 있음
- one-time pad는 전체 메시지 크기만큼의 진짜 무작위 데이터를 쓰며 깨지지 않지만, 대부분의 목적에는 매우 비실용적임
- 보통은 스트림 암호나 counter mode로 동작하는 블록 암호가 작은 키에서 필요한 길이의 키스트림을 만듦
- 이 방식은 좋은 키스트림이 있을 때 기밀성을 제공할 수 있지만, 메시지 변조를 검출하는 무결성은 제공하지 않음
- 무결성 보호는 별도 문제임
- 초보 암호 시스템 설계에서 무결성을 빼는 것은 흔한 실수이며, 더 복잡한 암호화 방식에서도 잘못된 결과를 낳음
- 하드웨어에서는 덧셈보다 XOR가 더 단순함
- 덧셈은 비트 사이 자리올림 전파가 필요해 칩 공간과 시간이 더 듦
- XOR는 자리올림이 없어 맞춤형 회로에서 더 저렴함
XOR 드로잉과 픽셀 그래픽
- 1980년대 가정용 컴퓨터는 화면 픽셀당 비트 수와 RAM이 제한되어 화면 전체를 두 벌 저장하기 어려웠음
- 움직이는 객체를 XOR로 그리면, 같은 객체를 다시 그리는 것만으로 원래 화면을 복원할 수 있음
- 픽셀 값
S와 움직이는 객체의 픽셀M을 XOR해C를 만들고, 나중에 같은M을 다시 XOR해S를 회복함
- 픽셀 값
- 여러 픽셀이 한 바이트에 packed되거나 bit plane 구조를 쓰는 화면에서는 덧셈 기반 합성이 까다로움
- 일반 덧셈은 한 픽셀의 자리올림이 다음 픽셀로 넘어갈 수 있음
- XOR는 자리올림이 전혀 없어 이런 문제가 없음
- XOR로 선을 그리면 두 선이 교차한 픽셀은 두 번 뒤집혀 배경색으로 돌아가 작은 흠처럼 보일 수 있음
- 이 흠은 선 하나를 지울 때 다른 선을 망가뜨리지 않는 대가로 받아들여졌음
- XOR 드로잉은 간단한 애니메이션에도 유리했음
- 새 선 하나를 그리고 오래된 선 하나를 다시 그려 지우면 다음 프레임이 됨
- 현재 화면의 모든 픽셀이나 모든 선을 다시 그릴 필요가 없어 메모리와 CPU 사용이 적음
- 1981년 게임 Qix의 움직이는 선, 초기 GUI의 창 이동 윤곽선에도 이런 방식이 쓰였음
반가산기 항등식
- 한 비트 덧셈에서
a+b의 낮은 비트는a XOR b, 높은 비트는a AND b임 - 같은 관계는 정수의 비트 단위 연산에도 성립함
a + b = (a XOR b) + 2 × (a AND b)a XOR b는 자리올림 없이 더한 값이고,a AND b는 각 자리에서 발생해야 했던 자리올림 비트들을 담음
- 이 관계는 반가산기 항등식으로 볼 수 있음
- 하드웨어 반가산기는 AND와 XOR 게이트로 두 비트 덧셈의 자리올림과 낮은 비트를 만듦
- 전체 정수 덧셈을 단순 연산만으로 만든 것은 아니며, 오른쪽 식의
+가 자리올림 전파를 마무리함
- 오버플로 없이 두 정수 평균을 구할 때 이 항등식을 쓸 수 있음
- 단순히
a+b후 오른쪽 시프트하면 33비트 합의 최상위 비트를 잃을 수 있음 - carry flag나 RRX/RCR 같은 명령이 없거나 불편한 CPU에서는
(a XOR b) >> 1 + (a AND b)형태가 대안이 됨 - 예시로 MIPS, RISC-V, DEC Alpha는 carry flag가 없고, 초기 Arm Thumb은 RRX가 빠져 있었음
- 단순히
- XOR 명령이 없는 CPU에서는 이 항등식을 뒤집어 XOR를 만들 수 있음
a XOR b = (a + b) − 2 × (a AND b)- 1970년대 Data General CPU는 AND는 있었지만 bitwise XOR가 없었음
비트와 값의 스왑
- 두 비트를 바꾸는 문제는 두 비트가 같으면 아무 작업도 필요 없고, 다르면 두 비트를 모두 뒤집는 문제로 줄어듦
- XOR와 시프트를 쓰면 두 비트가 다른지 찾고 필요한 경우 두 위치를 모두 뒤집을 수 있음
diff_all = input XOR (input >> distance)로 일정 거리만큼 떨어진 비트쌍의 차이를 계산함AND로 관심 있는 위치만 골라냄- 선택된 차이를 다른 위치로 복제한 뒤 입력에 XOR해 필요한 경우에만 두 비트를 뒤집음
- 같은 거리만큼 떨어진 여러 비트쌍을 한꺼번에 바꾸는 데도 같은 방식이 쓰일 수 있음
- 한 비트 마스크 대신 여러 비트를 담은 마스크를 사용함
- Beneš network는 여러 단계에서 같은 거리의 많은 쌍을 교환해 임의의 순열을 표현할 수 있음
- 두 값 전체를 바꾸는 세 번의 XOR 스왑도 가능함
a = a XOR bb = b XOR aa = a XOR b- 임시 변수가 없어도 두 값이 서로 교환됨
- 세 번의 XOR 스왑에는 별칭(aliasing) 문제가 있음
- 서로 다른 변수를 바꿀 때는 동작함
- 배열의 같은 원소를 자기 자신과 바꾸는 경우처럼 두 이름이 같은 저장 위치를 가리키면 값이 0이 될 수 있음
Nim 게임과 XOR
- Nim은 여러 더미에서 차례로 하나의 더미를 골라 1개 이상 원하는 수만큼 말을 제거하는 게임이며, 더 이상 움직일 수 없으면 짐
- 단순 버전의 Nim에서 지는 위치는 모든 더미 크기의 비트 단위 XOR가 0인 위치임
- XOR가 0인 위치에서 한 더미 크기
a를 다른 값b로 바꾸면 전체 XOR는a XOR b만큼 바뀌며,a≠b이므로 0이 아니게 됨 - XOR가 0이 아닌 위치에서는 전체 XOR값
x의 가장 높은 1 비트를 보고, 그 비트가 1인 더미를 골라 크기를pile XOR x로 줄이면 전체 XOR를 0으로 만들 수 있음 - 예시로 더미 크기 12, 10, 3은 이진수
1100,1010,0011이고 XOR는0101임- 가장 큰 더미 12만
0101을 XOR했을 때 9로 줄어듦 - 승리 수는 12에서 3개를 제거해 9로 만드는 것임
- 가장 큰 더미 12만
XOR처럼 보이는 수학 구조
- 집합론의 대칭차
X∆Y는 어떤 원소가 두 집합 중 정확히 하나에만 속할 때 포함하는 연산임- 원소 포함 여부를 불리언 값으로 보면 대칭차는 XOR와 같음
- 따라서 교환법칙과 결합법칙 같은 XOR 성질을 공유함
- 군론에서 지수 2인 군은 모든 원소가 자기 역원인 군임
- 이런 군의 연산은 결합법칙을 만족하고, 표준 연습으로 교환법칙도 따름
- 같은 원소 두 개가 함께 있으면 상쇄되는 점이 XOR와 닮음
- 모든 지수 2인 군은 어떤
{0,1}값 함수들의 비트 단위 XOR 형태로 이해할 수 있음
- Sprague-Grundy 분석에서는 많은 impartial game 위치에 Grundy number를 부여함
- 여러 하위 게임을 하나로 합친 composite의 Grundy number는 각 구성 게임의 Grundy number를 bitwise XOR한 값으로 계산됨
- game theory에서는 비음수 정수의 bitwise XOR를 nim-sum이라고 부르기도 함
- 체
GF(2)는 원소가 0과 1뿐인 유한체임- 덧셈과 뺄셈은 XOR처럼 동작함
- 곱셈은 AND처럼 동작함
- 따라서
a AND (b XOR c) = (a AND b) XOR (a AND c)가 성립함
GF(2) 위 선형대수와 오류 정정
GF(2)위 벡터와 행렬은 성분이 0 또는 1인 구조이며, 벡터나 행렬의 덧셈은 성분별 XOR임- 행렬
M에 벡터v를 곱하는 것은v의 1 성분이 선택한M의 열들을 XOR로 합치는 것과 같음 - 오류 정정 코드는
m비트 메시지를 더 긴n비트 코드워드로 확장해 일부 비트 오류를 검출하거나 정정할 수 있게 함- 유효한 코드워드들이 서로 많은 비트에서 다르면, 적은 수의 비트 오류는 다른 유효 코드워드로 바뀌지 않음
- 두 유효 코드워드가 최소
k비트 다르면k보다 적은 오류는 검출 가능하고,k/2보다 적은 오류는 가장 가까운 코드워드를 찾아 정정 가능함
- 선형 코드는
GF(2)위 generator matrix와 check matrix를 사용함- sender는 generator matrix로
m비트 메시지를n비트 코드워드로 확장함 - receiver는 check matrix로 수신 코드워드가 유효한지 확인하고, 오류가 있으면 syndrome을 얻음
- 같은 오류 패턴은 메시지와 무관하게 같은 syndrome을 생성함
- sender는 generator matrix로
- Hamming code는 코드 길이
n이2^d−1인 경우의 예시임n=15이면 15비트 위치를 0001부터 1111까지의 4비트 비영 숫자로 번호 매김함- 수신자는 1인 비트의 인덱스를 모두 XOR하며, 결과가 0이면 유효 코드워드임
- 한 비트가 뒤집히면 XOR 결과가 바로 뒤집힌 비트의 인덱스가 되어 lookup table 없이 1비트 오류를 고칠 수 있음
- 15비트 Hamming code는 11비트 데이터를 담고 4비트를 오류 정정에 사용함
GF(2) 다항식, CRC, 더 큰 유한체
GF(2)위 다항식은 계수가 0 또는 1인 형식적 다항식이며, 덧셈은 같은 차수 계수끼리 XOR하는 것과 같음- 다항식 곱셈은 일반 다항식처럼 부분곱을 만들고 계수를 mod 2로 줄이는 방식임
- 이 표현을 비트열로 보면 정수 곱셈과 비슷하지만, 부분곱을 합칠 때 일반 덧셈 대신 carry 없는 XOR를 씀
- x86은
CLMUL을 포함한 carryless multiplication 명령을 제공하고, Arm은 polynomial multiplication 계열 명령을 제공함
- CRC는
GF(2)다항식 나눗셈의 나머지를 체크섬으로 쓰는 방식임- 송신 메시지 비트열을 큰 다항식
M으로 보고, 합의된 다항식P로 나눈 나머지M mod P를 유지함 - Ethernet과 유사한 네트워크 패킷 검증에 사용됨
- CRC는 오류를 정정하지 않고 검출만 하며, 거의 모든 전송이 정상이고 드물게 비트 뒤집힘이나 노이즈가 생기는 상황에 맞음
- 송신 메시지 비트열을 큰 다항식
- 더 큰 유한체는
GF(p)위 다항식을 irreducible polynomialQ로 나눈 나머지 구조로 만들 수 있음Q의 차수가d이면 새 유한체는p^d개의 원소를 가짐p=2인 경우 irreducible polynomial은 비트 패턴을 정수처럼 적을 수 있으며, 해당 수열은 OEIS A014580에 등록되어 있음
- 2의 거듭제곱 크기 유한체는 여러 암호 기술에 등장함
2^8크기 유한체는 AES와 Twofish의 핵심 구성 요소임2^128크기 유한체는 bulk encryption과 integrity protection을 결합하는 GCM에 쓰임- 2의 거듭제곱 크기 유한체는 일부 elliptic-curve cryptography와 post-quantum 방식인 Classic McEliece의 decoding 알고리듬에도 등장함