본문 바로가기
프로그래밍/C

XOR 연산자의 활용

by 알용 2012. 11. 19.
반응형

프로그래밍을 하다 보면 가끔 이런 상황이 생길 때가 있습니다.

 

플레이어의 국가(미국 or 러시아)를 저장하는 변수 state 가 있다고 합시다.

 

국가가 미국이면 state 변수에 1을, 러시아라면 2를 저장하여 구별합니다.

 

관리자가 </국가변경 플레이어번호> 를 입력했을 때 두 가지 상황이 생기게 됩니다.

(단, 기타 오류로 인해 변수 state의 값이 1 또는 2가 아닐 경우는 생략)

 

첫번째, 플레이어의 국가가 미국일 때.

플레이어가 미군일 때, 즉 state 변수의 값이 1일 때

플레이어의 국가를 러시아로 변경하기 위해서 state 변수의 값을 2로 조정해야 합니다.

 

두번째, 플레이어의 국가가 러시아일 때.

플레이어가 러시아군일 때, 즉 state 변수의 값이 2일 때

플레이어의 국가를 미국으로 변경하기 위해서 state 변수의 값을 1로 조정해야 합니다.

 

 

요약해서, state 변수의 값이 1이면 2로, 2면 1로 변경해야 합니다.

 

대게 이런 경우, 아래와 같이 코딩하는 것이 일반적입니다.

(정확하게 하자면 PlayerInfo[giveplayerid][pState] 와 같이 변수명을 FullName으로 적어야겠지만 생략합니다, 그것이 이 글의 중점이 아니니까요.)

 

if( state == 1 )

state = 2;

else

state = 1;

 

또는,

 

state = (state == 1) ? 2:1;

 

 

물론 나쁘지 않은 코드입니다만, XOR 연산자의 활용이 주제인만큼 XOR 연산자를 활용해서 코딩해보겠습니다.

 

state ^= 3; // ( state = state^3 ) 와 동일합니다, +=, -= 쓰는 것과 같아요

 

 

Pawn을 한지가 오래되서 Pawn에서 ^ 연산자가 XOR 연산자인지 거듭제곱 연산자인지 기억이 나질 않습니다만,

 

아마 XOR 연산자인 것으로 기억합니다.

 

컴퓨터 일반 교과에서 배우시겠지만 XOR은 배타적 논리합입니다.

 

모르시는 분들을 위해 간략하게나마 적어놓습니다.

 

임의의 명제 A,B 가 있다고 가정하고 다음을 보시기 바랍니다.

 

논리합(OR) =  A와 B 중 어느 것 하나라도 참이면 참

논리곱(AND) = A와 B 모두 참이어야 참

배타적 논리합(XOR) = A와 B의 값이 달라야 참(ex:A가 참, B가 거짓일 경우 참  |  A가 거짓, B가 참일 경우 참) 

 

 

이 외에도 프로그래밍에서 빠질 수 없는 알고리즘인 Swap도 XOR 연산자를 이용해 간단하게 해결할 수 있습니다.

 

Swap을 처음 들어보시는 것 같지만, 즐겨들 하시는 서든어택에서 1,2,3,4 키를 이용해 무기를 바꾸는 행위를 Swap이라고 하죠.

 

임의의 정수형 변수 A와 B가 있고 각각 3과 5라는 값을 저장하고 있을 때,

 

변수 B에 3을 저장하고 변수 A에 5를 저장하려고 합니다.

 

간단할 것 같지만 Swap 알고리즘도 처음 하시는 분들한테 시켜보시면 꽤 애먹으시더라고요. (저도 그랬습니다.)

 

int A = 3, B = 5;

int temp;

 

temp = A;

A = B;

B = temp;

 

 

이번엔, XOR 연산자를 이용해 Swap 알고리즘을 구현해 보겠습니다.

 

int A = 3, B = 5;

 

A ^= B;

B ^= A;

A ^= B;

 

값을 뒤바꾸는 명령문은 똑같이 세개지만 변수를 사용하지 않고 처리했다는 점에서 의미가 있습니다.

 

아래 코드는 XOR 연산자와는 관계 없는 내용인데 알고 계시면 좋을 것 같아서 적습니다.

 

똑같은 Swap 알고리즘 코드입니다.

 

int A = 3, B = 5;

 

A = A+B;

B = A-B;

A = A-B;

 

 

알고 있으면 꽤 유용하실 것 같습니다.

 

한 때는 "XOR 연산자는 쓰지도 않는데 뭐하러 만들어놓은걸까" 라고 생각하기도 했는데 

 

알고 보니까 무시할 수 없는 마법 연산자네요.

 

 

더위 조심하시고 시원한 여름 나세요. 

반응형