XOR를 이용한 Toggle
C, C++, Java 이 모든 언어의 공통적인 특징중의 하나가 bit 연산이 가능하다는 것.
아무래도 인간은 0과 1의 bit 배열보다는 10진수에 익숙한데
bit 연산이 효율이 좋은건 누구나 알고 있는 사실.
앞으로도 bit연산에 대해서 계속 포스팅을 하겠지만 오늘은 bit 연산 기법중 기본이라 할 수 있는 toggle 방식을 보겠다.
프로그래밍을 하다가 보면 Toggle을 해야하는 경우가 많다.
가장 많은 경우가 특정 버튼을 눌렀을 때 값을 0과 1 혹은 true, false로 계속 토글하는 경우가 되겠다.
java 언어를 기준으로 설명을 하자면,
버튼이 눌릴 때 호출되는 함수를 onClick(.... ) 이라고 가정할 때 아래와 같이 짜는 경우가 생각보다 많다.
boolean toggle = false;
.....
public void onClick(....)
{
if ( toggle )
toggle = false;
else
toggle = true;
}
굳이 java언어를 택한 것은 java언어 문법상 if문 안에는 반드시 boolean 타입의 변수 혹은 조건문이 들어와야 하고 (if (1) 허용 안됨)
boolean이라는 type이 존재하기 때문에 선택을 하였다.
위 코드는 못짰다고 할 수 없고 성능이 그리 나쁜 코드라고 하기도 그렇지만 고급스럽지는 못하다.
단순하게 true와 false로 토글하는 경우라면 아래와 같이 한줄만에 짤 수 있다.
boolean toggle = false;
.....
public void onClick(....)
{
toggle = !toggle;
}
요즘같이 컴파일러가 좋은 시대엔 큰 차이는 없지만 조건문이 하나 들어가느냐 안들어 가느냐의 차이는 분명 존재한다.
온라인게임의 서버프로그래밍이라면 이런 사소한것 하나의 차이가 렉을 결정할 수도 있다.
이것 말고 다른 토글은 어떤게 있는가.
예를 들어, 위와 같이 특정 버튼을 누를 경우 단순히 true, false 혹은 0, 1이 아닌 3, 4와 같은 값으로 토글이 되는 경우를 보자.
이럴 때 바로 XOR가 쓰이게 되는데, XOR는 language에서 ^로 표현되며, 두 비트가 다를 경우에면 1를 리턴한다.
암호학에서는 XOR가 암호학의 근간이 되는 아주 기본적인 개념이며 암호화/복호화는 일종의 토글에 해당한다.
3과 4를 왔다 갔다 하기 위해선 key가 필요한데,
key는 다음과 같이 구한다.
key = 3 ^ 4;
실제로 3과 4를 XOR 해보면 key는 7임을 알 수 있다.
0011 = 3
0100 = 4
0111 = 7
그러나 우리는 key의 값이 무엇인지 크게 관심가질 필요가 사실 없다.
왜냐면 key는 상수의 개념으로 계속 활용 될 뿐, 출력하거나 조작할 필요도 없다.
이제 위 코드에 적용해서 버튼을 한번 누르면 3, 다시 한번 누르면 4로 바뀌는 코드를 만들어보자.
물론... 처음처럼 if ( value == 3 ) value = 4; 와 같은;; 방법을 써도 크게 문제는 없겠지만.....
int value = 3; // 3과 4로 토글
int key = 3 ^ 4;
....
public void onClick(....)
{
value = value ^ key;
}
뭐 value^=key; 로 써도 좋다. 그러나 성능의 차이가 없으면 가독성을 위해 위와 같이 써주자.
실제로 계산해보면 3과 4로 계속 바뀌는 걸 알 수 있다.
위에서 중요한건, key를 구하는 요령이다.
앞으로 토글이 나오면 항상 XOR를 생각하자