F.R.I.D.A.Y.

XOR: 배타적 논리합 본문

DEV/C C++

XOR: 배타적 논리합

F.R.I.D.A.Y. 2020. 2. 28. 22:56
반응형

 일전에 비트 연산자에 대해 다룬 글이 몇 개 있습니다.

 이 글들에선 비트합과 비트곱에 대한 내용이 주를 이루었습니다. 그러나 배타적 비트합(XOR)의 경우에는 잘 다뤄지지 않았던 것 같아 이번에 XOR을 소개하고자 이 글을 펼칩니다.

 

# 비트 연산자를 사전에 알고 있어야 합니다.

# 배타적 비트합(^)에 대한 설명을 찾고 있나요?


배타적 논리합

의미

 '배타적'이란 의미를 알아본다면

네이버 사전

 남을 배척한다는 의미를 가지는데 논리합에 이 의미를 붙여본다면, 둘 중 하나만 참일 때 참을 반환한다는 것이라 생각할 수 있습니다. 둘이 참인 경우에도 참인데 다른 하나가 참이 아니어야 참으로 하겠다는 의미가 배타[# 그래서 XOR을 설명할 때 다르면 참, 같으면 거짓이라 말하는 것이 그 결과로는 맞을지언정 실제 배타적 논리합을 설명하는 문장으로는 부적절합니다.]로 볼 수 있으니까요.

논리합

 C언어를 비롯한 많은 언어에서 배타적 비트합 연산자는 제공하더라도, 배타적 논리합 연산자는 제공하지 않습니다. 둘 중 하나인 경우에만 참인 경우가 필요하지 않기 때문입니다.

 예를 들어, 집에서 마트에 간다고 해보겠습니다. 가는 길이 멀기 때문에 어떤 교통수단을 이용할 겁니다.

택시 자가용 지하철 버스

 이 교통수단 중, 하나를 선택하면 다른 세 개의 수단은 자동으로 배제됩니다. 몸은 하난데 여러 수단을 동시에 사용할 수는 없으니까요. 즉, 논리에서 이미 다른 선택지를 배제할 수 있습니다.

 

 그래도 필요할 수도 있겠죠. 그런 경우를 대비해 논리합 연산자를 만들 수도 있을 것입니다. 물론, 직접 연산자를 만들 수는 없으니[# 만들려면 컴파일러를 다시 만들어야 하니 만들 수 없는 것으로 칩시다!] 같은 기능을 하는 함수를 만들어 보겠습니다.

int LogicalXor(int value1, int value2){
    value1 = !(value1);
    value2 = !(value2);
    
    return value1 ^ value2;
}

 배타적 논리합[# 배타적 비트합 포함]의 경우 양쪽의 피연산자가 참인지 거짓인지는 크게 중요하지 않습니다. 가장 중요한 것은 양쪽 피연산자끼리의 관계입니다. 분명 위에서 배타적 논리합은 두 값 중 하나만 참인 경우를 찾으면 됩니다.

  1. 인자로 들어오는 value1 변수의 값과 value2 변수의 값이 서로 다르면 참이기 때문에, 먼저 각 변수의 값을 비트 하나로 표현할 수 있도록 논리 부정 연산자(!)를 이용해 1과 0으로 만들어줍니다.
  2. 비트 하나에 값이 표현되어 있으므로 배타적 비트합 연산자(^)로 연산한 결과를 반환하면 인자로 들어온 두 값 중 하나가 참일 때만 참을 반환합니다.

함수의 사용 예와 그 결과 값

 확인 결과 정상 동작함을 알 수 있습니다.

# index

728x90
반응형
Comments