目次
1. 소개
C 언어에서의 비트 연산 개요
C 언어는 메모리와 프로세서를 효율적으로 다루기 위해 비트 연산을 제공합니다. 그 중에서도 특히 중요한 것이 “XOR(배타적 논리합)”입니다. 비트 연산은 일반적으로 데이터 암호화, 데이터 검증, 수치 연산 등 다양한 상황에서 활용됩니다. XOR는 두 비트가 다를 때 “1”을, 같을 때는 “0”을 반환하는 특성을 가지고 있어, 단순하면서도 강력한 연산으로 알려져 있습니다. 이 글에서는 C 언어에서의 XOR 연산의 기초부터 응용까지 순차적으로 설명합니다. 실제 코드 예제를 포함하여 초보자도 이해하기 쉽도록 구성되었습니다.2. XOR 연산자의 기본
XOR란?
XOR(배타적 논리합)은 비트별로 두 개의 수를 비교하여 각 비트가 서로 다르면 “1”을, 같으면 “0”을 반환합니다. 예를 들어, 아래와 같이 숫자 5와 9의 비트별 비교를 수행하면 XOR 연산 결과를 얻을 수 있습니다。- 5의 2진수:
0101
- 9의 2진수:
1001
비트 위치 | 5 (0101) | 9 (1001) | XOR 결과 |
---|---|---|---|
1 | 0 | 1 | 1 |
2 | 1 | 0 | 1 |
3 | 0 | 0 | 0 |
4 | 1 | 1 | 0 |
1100
이며, 이는 10진수로 “12”입니다. 이 XOR 연산의 기본 동작을 이해함으로써 보다 복잡한 비트 연산에도 응용할 수 있습니다。3. 샘플 코드를 통해 XOR 이해
기본적인 XOR 사용 예
C 언어에서 XOR 연산을 수행하는 간단한 예를 아래에 보여줍니다. 이 코드는 숫자 5 9에 대해 XOR 연산을 수행하고 그 결과를 표시합니다.#include <stdio.h>
int main() {
int a = 5;
int b = 9;
int result = a ^ b;
printf("5 XOR 9 = %dn", result); // 결과는 12
return 0;
}
이 코드는 숫자 a
와 b
의 비트별 XOR을 계산하고, 결과가 result
에 저장됩니다. 실행하면 “5 XOR 9 = 12″가 표시됩니다. 비트별 연산을 시각적으로 이해하기 위한 좋은 예입니다.4. XOR의 응용 예
XOR을 이용한 변수 값 교환
XOR의 독특한 특성을 이용하면 두 변수의 값을 임시 변수를 사용하지 않고 교환할 수 있습니다. 아래 코드는 XOR을 사용하여 두 변수a
와 b
의 값을 교환하는 방법을 보여줍니다.#include <stdio.h>
int main() {
int a = 5;
int b = 7;
printf("Before swap: a = %d, b = %dn", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("After swap: a = %d, b = %dn", a, b);
return 0;
}
이 코드에서는 XOR을 3번 사용하여 a
와 b
의 값을 효율적으로 교환합니다. 이를 통해 임시 변수를 사용하지 않고 값을 교체할 수 있어 메모리 절약에 도움이 됩니다.
5. 실용 예제와 적용 범위
배열 내 중복되는 숫자와 홀수 회 등장하는 숫자 탐지
XOR은 배열 내 중복 요소와 홀수 회 등장하는 요소를 효율적으로 탐지할 수도 있습니다. 아래에 중복된 요소를 탐지하는 예와, 홀수 회 등장하는 요소를 찾는 코드를 보여드립니다.중복된 숫자 찾기
#include <stdio.h>
int findDuplicate(int nums[], int size) {
int duplicate = 0;
for (int i = 0; i < size; i++) {
duplicate ^= nums[i];
}
return duplicate;
}
int main() {
int nums[] = {1, 2, 3, 2, 4};
int size = sizeof(nums) / sizeof(nums[0]);
printf("Duplicate number is: %dn", findDuplicate(nums, size));
return 0;
}
이 코드에서는 XOR을 사용하여 배열 내 중복된 수치를 탐지합니다. XOR의 특성을 이용해 같은 수치를 두 번 XOR하면 0이 되고, 중복되는 수치만 결과에 남습니다.홀수 회 등장하는 숫자 탐지
#include <stdio.h>
int findOddOccurrence(int nums[], int size) {
int result = 0;
for (int i = 0; i < size; i++) {
result ^= nums[i];
}
return result;
}
int main() {
int nums[] = {5, 3, 9, 3, 5, 9, 7};
int size = sizeof(nums) / sizeof(nums[0]);
printf("Odd occurring number is: %dn", findOddOccurrence(nums, size));
return 0;
}
이 코드에서는 홀수 회 등장하는 숫자만 최종적으로 XOR 결과에 남기 때문에 간단히 탐지할 수 있습니다.데이터 암호화에서 XOR 활용
XOR은 데이터 암호화에도 사용됩니다. 아래 코드는 XOR을 이용한 간단한 암호화와 복호화 예시를 보여줍니다.#include <stdio.h>
void encryptDecrypt(char data[], char key) {
for (int i = 0; data[i] != '�'; i++) {
data[i] = data[i] ^ key;
}
}
int main() {
char data[] = "Hello World";
char key = 'K';
printf("Original: %sn", data encryptDecrypt(data, key);
printf("Encrypted: %sn", data);
encryptDecrypt(data, key);
printf("Decrypted: %sn", data);
return 0;
}
이 코드에서는 데이터에 XOR 연산을 적용하여 암호화와 복호화를 수행합니다. XOR을 다시 적용하면 원본 데이터로 복원되므로, 간단한 암호화 기술로 활용됩니다.