알고리즘/Bits
Bits 팁
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
반응형