C 언어 XOR 연산 완전 해설 | 기본부터 응용까지 철저 가이드

1. 소개

C 언어에서의 비트 연산 개요

C 언어는 메모리와 프로세서를 효율적으로 다루기 위해 비트 연산을 제공합니다. 그 중에서도 특히 중요한 것이 “XOR(배타적 논리합)”입니다. 비트 연산은 일반적으로 데이터 암호화, 데이터 검증, 수치 연산 등 다양한 상황에서 활용됩니다. XOR는 두 비트가 다를 때 “1”을, 같을 때는 “0”을 반환하는 특성을 가지고 있어, 단순하면서도 강력한 연산으로 알려져 있습니다. 이 글에서는 C 언어에서의 XOR 연산의 기초부터 응용까지 순차적으로 설명합니다. 실제 코드 예제를 포함하여 초보자도 이해하기 쉽도록 구성되었습니다.

2. XOR 연산자의 기본

XOR란?

XOR(배타적 논리합)은 비트별로 두 개의 수를 비교하여 각 비트가 서로 다르면 “1”을, 같으면 “0”을 반환합니다. 예를 들어, 아래와 같이 숫자 5와 9의 비트별 비교를 수행하면 XOR 연산 결과를 얻을 수 있습니다。
  • 5의 2진수: 0101
  • 9의 2진수: 1001
이 비트를 XOR 연산으로 비교하면 다음과 같습니다。
비트 위치5 (0101)9 (1001)XOR 결과
1011
2101
3000
4110
결과는 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;
}
이 코드는 숫자 ab 의 비트별 XOR을 계산하고, 결과가 result 에 저장됩니다. 실행하면 “5 XOR 9 = 12″가 표시됩니다. 비트별 연산을 시각적으로 이해하기 위한 좋은 예입니다.

4. XOR의 응용 예

XOR을 이용한 변수 값 교환

XOR의 독특한 특성을 이용하면 두 변수의 값을 임시 변수를 사용하지 않고 교환할 수 있습니다. 아래 코드는 XOR을 사용하여 두 변수 ab의 값을 교환하는 방법을 보여줍니다.
#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번 사용하여 ab의 값을 효율적으로 교환합니다. 이를 통해 임시 변수를 사용하지 않고 값을 교체할 수 있어 메모리 절약에 도움이 됩니다.

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을 다시 적용하면 원본 데이터로 복원되므로, 간단한 암호화 기술로 활용됩니다.

6. 요약

이 기사에서는 C 언어에서 XOR 연산의 기본적인 사용법부터 응용 예제까지를 설명했습니다. XOR은 데이터 암호화, 오류 검사, 프로그램 최적화, 해시 함수 설계 등 다양한 분야에서 활용되고 있습니다. 특히 그 고속성과 효율성 때문에 대규모 데이터 처리 및 성능이 요구되는 상황에서 중요한 역할을 합니다. 이 기사를 통해 XOR 연산이 얼마나 강력한 도구인지 이해하고, 앞으로의 프로그래밍에 도움이 되길 바랍니다.