Swap (베타적 OR - XOR 사용)
#include <iostream>
using namespace std;
void main()
{
unsigned short a = 0x1; // 0001
unsigned short b = 0x5; // 0101
cout << (a^b) << endl; // 4 = 0100
getchar();
}
컴퓨터 관련 전공이나 전산 쪽이면 XOR는 많이 봤을 것이다.
A |
B |
결과 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
A와 B의 입력이 있을 때 둘 중 하나만 1일 경우가 1이다 라는 것인데
이를 코드로 표현 할 일이 거의 없지만
두개의 변수의 값을 교환 할때 사용할 수 있단 걸 알게 되었다.
이전에는
temp = a;
a = b;
b = temp;
이런식으로 별도의 동일한 자료형의 더미를 만들어 Swap을 하였으나
아래와 같이 XOR을 3번 해주고 각각 변수 A, B, A 순으로 담아주면
더미 변수 없이도 서로 값이 바뀌는 것을 결과로서 볼 수 있다.
주석의 이진 수를 참고하여 아래의 코드를 봐보자.
#include <iostream>
using namespace std;
void main()
{
int a = 127; //1111 1111
int b = 59; //0111 1011
a = a ^ b; // a = 1000 0100
b = a ^ b; // b = 1111 1111
a = a ^ b; // a = 0111 1011
cout << a << endl;
cout << b << endl;
int c = 60817; //0000 0000 0000 0000 0000 1110 1101 1001 0001
int d = 201606; //0011 1011 0110 0100 0111 0001 0011 1000 0110
c = c ^ d; // c = 0011 1011 0110 0100 0111 1111 1110 0001 0111
d = c ^ d; // d = 0000 0000 0000 0000 0000 1110 1101 1001 0001
c = c ^ d; // c = 0011 1011 0110 0100 0111 0001 0011 1000 0110
cout << c << endl;
cout << d << endl;
getchar();
}
'공부 > c++(c, STL)' 카테고리의 다른 글
[코딩문제]n번째 피보나치 나머지 구하기 - 2 (0) | 2016.07.11 |
---|---|
[코딩문제]n번째 피보나치 나머지 구하기 - 1 (0) | 2016.07.10 |
[코딩문제]계단 오르기 - 3 계단 (0) | 2016.06.23 |
[코딩문제]피보나치 수열 (0) | 2016.06.20 |
[코딩문제]셀프 넘버(self-number) 풀이 (0) | 2016.06.18 |