■
Bool(부울) 연산은 크게 NOT, AND, OR, XOR이 있다.
NOT
입력 | 출력 |
0 | 1 |
1 | 0 |
AND
입력1 | 입력2 | 출력 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
OR
입력1 | 입력2 | 출력 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
XOR
입력1 | 입력2 | 출력 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
■■
그렇다면 코딩에서의 비트 연산은 어떻게 표현할까?
AND = &
OR = |
XOR = ^
NOT = ~
간단하게 True와 False로 연산을 표현해보자.
True & False = False
True | False = True
True ^ True = False
~ True = -2
어?! 그런데 ~ True의 출력 값이 not 1의 출력 값과 같은 0이 되어야하는 것이 아닌가?
자, 여기서 2의 보수에 대한 설명이 들어간다.
■■■
2의 보수는 컴퓨터가 음수를 저장하기 위해 일반적으로 취하는 방법 중 하나이다.
예를 들어서 4비트로 숫자를 표현한다면 0000 ~ 1111까지 총 2^4인 16개가 있다는 것을 알 수 있다. 10진법으로 0 ~ 15까지 표현이 가능하다는 것이다. 하지만 음수로는 어떻게 표현할까?
바로 가장 맨 앞에 있는 비트(□xxx)를 사용하는 것이다.
다시 이전의 연산 ~True가 -2가 되는 이유로 돌아가보자.
여기서 연산자 ~(NOT)은 간단하게 말하면 2의 보수에서 1을 뺀 값과 같다.
1(True)의 2의 보수는 -1 = 1111이되고 여기서 1을 빼면 1110 = -2가 된다.
다음 표를 확인해보면 이해하기 쉬울 것이다.
10진법 | 2의 보수 |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
-8 | 1000 |
-7 | 1001 |
-6 | 1010 |
-5 | 1011 |
-4 | 1100 |
-3 | 1101 |
-2 | 1110 |
-1 | 1111 |
■■■■
비트 연산에 대해 좀 더 살펴보자.
bin(0b0110 + 0b0010) = 0b1000
bin(0b0011 * 0b0101) = 0b1111
bin(0b1101 >> 2) = 0b11
bin(0b1101 << 2) = 0b110100
bin(0b0101 ^ ~0b1100) = -0b1010
여기서 +와 *는 일반적인 사칙연산과 같다.
0110 + 0010 = 1000
11 * 101 = 1111
>>, <<는 각각 오른쪽으로 이동, 왼쪽으로 이동하는 것을 말한다.
마지막으로 0101 ^ ~1100의 연산 과정을 자세히 살펴보자.
우선 ~1100의 결과는 0011이된다. 그리고 0101 ^ 0011 = 0110이 되야 할 것이다.
하지만 결과 값은 -1010이다.
왜?
그것은 앞서 설명한 2의 보수를 적용하지 않았기때문이다. 또한 1100의 값을 음수 -4가 아닌 양수 12로 가정했다.
1100 = 12이고 NOT 12는 -12 -1 = -13이 된다. 이전에 NOT은 2의 보수에 1을 뺀값이라고 언급한바있다.
-13은 10011(-16+3)이라하고 앞의 0101과 XOR 연산
0101 ^ 10011 = 10110
바로 -10이된다.
그렇다면 처음에 연산한 결과 값 0110이 될 수는 없을까??
여기서는 ~연산을 다른 형태로 수정해주어야한다.
최댓값과 XOR 연산을 해주는 형태로 다음과 같이 수정하면된다.
0101 ^ (1100 ^ 1111)
연산해보면 결과 값이 0110 = 6이 나오는 것을 확인할 수 있을 것이다.
비트 연산에 대한 설명은 여기까지만...
'Algorithm & Data Structure > Theory' 카테고리의 다른 글
[Python] Greedy(그리디) (0) | 2020.12.10 |
---|---|
[Python] Sliding Window(슬라이딩 윈도우) (0) | 2020.11.29 |
[Python] Binary Search(이진 검색) (0) | 2020.11.26 |
[Python] Sort(정렬) (0) | 2020.11.24 |
[Python] Trie(트라이) (0) | 2020.11.08 |