Algorithmus 2022. 4. 3. 23:38

NOT 연산: Indexing 에서 반대편 끝으로 보내기

A = [3,4,5,2,6] 가 있다. 만일 앞에서 부터 두번째를 나타내는 인덱스 값을 i에 저장하면 i = 1 이 되며, A[i] 는 4 가 된다. 그러면 끝에서 두번째 즉 -2 번째를 i 와의 관계식으로 나타내려면 -1 - i 라고 해야 하는데 이것은 앞에서부터 인덱싱할 경우 0부터 시작하지만 뒤에서부터 인덱싱 할 경우 -1부터 시작하기 때문이다. 그러면 이것을 간단하게 나타내려면 보수를 쓰면 된다. 즉, ~i 라고 하면 정확히 대칭이 되는 뒤에서부터의 위치를 구해준다.

왜 그럴까. NOT 연산은 어떤 경우든 다음의 간단한 규칙으로 정리된다.

1. 부호 뒤집기

2. 1 빼기

         x값 -2 2
1단계. 부호 뒤집기 2 -2
2단계. 1빼기 2-1 -2-1
         결과 1 -3

실제로 다음과 같이 연산이 됨을 확인할 수 있다.

>>> ~(-2)
1
>>> ~2
-3

XOR 연산: Toggle 하기

1 또는 2의 두 int 값을 갖는 변수가 있다고 하자. 어떤 이벤트가 발생하면 이 변수의 값을 다른 하나의 값으로 (1 -> 2 또는 2 -> 1) 바꿔주는, 즉 toggle 하는 방법은 무엇일까. 변수를 x 라 하자. 그러면 아래처럼 할 수 있다.

if x == 1:
	x = 2
elif x == 2:
	x = 1

그런데 이것을 bit 연산자를 이용해 더 간편하게 하는 방법이 있다. ^는 XOR 연산자로, 두 비트가 모두 1이면 0을 만들어 버리고, 둘 중 하나가 1이면 1이 되는 배타적 논리합이다.

x ^= 3

이는 어떤 경우의 수도 따지지 않고 아래처럼 원하는 작용을 해준다.

# x == 1 인 경우
x    3
01 ^ 11 = 10

# x == 2 인 경우
x    3
10 ^ 11 = 01

 

0과 1을 번갈아 바꾸고자 하면 다음과 같이 할 수 있다. 이분그래프 등 그룹을 반복해서 구분할 때 활용할 수 있다.

>>> 0^1
1
>>> 1^1
0

 

반응형