일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Programming
- Windows
- 문법
- 지식나눔강좌
- c#
- Direct2D
- Win32
- 리뷰
- 백준
- c++
- Tips강좌
- tipssoft
- CS
- 프로그래밍
- Javascript
- 배열
- 알고리즘
- 티스토리
- 이지스퍼블리싱
- 포인터
- VS ERROR
- Desktop
- 김성엽
- c
- Tips프로그래밍강좌
- 연산자
- doit코틀린프로그래밍
- Visual Studio
- Kotlin
- 함수
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
XOR: 배타적 논리합 본문
일전에 비트 연산자에 대해 다룬 글이 몇 개 있습니다.
# 비트 연산자를 다룬 글
이 글들에선 비트합과 비트곱에 대한 내용이 주를 이루었습니다. 그러나 배타적 비트합(XOR)의 경우에는 잘 다뤄지지 않았던 것 같아 이번에 XOR을 소개하고자 이 글을 펼칩니다.
# 비트 연산자를 사전에 알고 있어야 합니다.
# 배타적 비트합(^)에 대한 설명을 찾고 있나요?
배타적 논리합
의미
'배타적'이란 의미를 알아본다면
남을 배척한다는 의미를 가지는데 논리합에 이 의미를 붙여본다면, 둘 중 하나만 참일 때 참을 반환한다는 것이라 생각할 수 있습니다. 둘이 참인 경우에도 참인데 다른 하나가 참이 아니어야 참으로 하겠다는 의미가 배타[# 그래서 XOR을 설명할 때 다르면 참, 같으면 거짓이라 말하는 것이 그 결과로는 맞을지언정 실제 배타적 논리합을 설명하는 문장으로는 부적절합니다.]로 볼 수 있으니까요.
논리합
C언어를 비롯한 많은 언어에서 배타적 비트합 연산자는 제공하더라도, 배타적 논리합 연산자는 제공하지 않습니다. 둘 중 하나인 경우에만 참인 경우가 필요하지 않기 때문입니다.
예를 들어, 집에서 마트에 간다고 해보겠습니다. 가는 길이 멀기 때문에 어떤 교통수단을 이용할 겁니다.
택시 | 자가용 | 지하철 | 버스 |
이 교통수단 중, 하나를 선택하면 다른 세 개의 수단은 자동으로 배제됩니다. 몸은 하난데 여러 수단을 동시에 사용할 수는 없으니까요. 즉, 논리에서 이미 다른 선택지를 배제할 수 있습니다.
그래도 필요할 수도 있겠죠. 그런 경우를 대비해 논리합 연산자를 만들 수도 있을 것입니다. 물론, 직접 연산자를 만들 수는 없으니[# 만들려면 컴파일러를 다시 만들어야 하니 만들 수 없는 것으로 칩시다!] 같은 기능을 하는 함수를 만들어 보겠습니다.
int LogicalXor(int value1, int value2){
value1 = !(value1);
value2 = !(value2);
return value1 ^ value2;
}
배타적 논리합[# 배타적 비트합 포함]의 경우 양쪽의 피연산자가 참인지 거짓인지는 크게 중요하지 않습니다. 가장 중요한 것은 양쪽 피연산자끼리의 관계입니다. 분명 위에서 배타적 논리합은 두 값 중 하나만 참인 경우를 찾으면 됩니다.
- 인자로 들어오는 value1 변수의 값과 value2 변수의 값이 서로 다르면 참이기 때문에, 먼저 각 변수의 값을 비트 하나로 표현할 수 있도록 논리 부정 연산자(!)를 이용해 1과 0으로 만들어줍니다.
- 비트 하나에 값이 표현되어 있으므로 배타적 비트합 연산자(^)로 연산한 결과를 반환하면 인자로 들어온 두 값 중 하나가 참일 때만 참을 반환합니다.
확인 결과 정상 동작함을 알 수 있습니다.
# index
'DEV > C C++' 카테고리의 다른 글
C: 숫자 지그재그로 출력하기 (0) | 2020.07.24 |
---|---|
프로그램에 일상을 더하다: 여러 항목 정렬하기 (0) | 2020.03.19 |
부동소수점 (2) | 2020.02.22 |
포인터(pointer) part4. 함수 포인터 배열 (0) | 2020.01.30 |
포인터(pointer) part3. 함수 포인터 (0) | 2020.01.30 |