Algorithm & Data Structure/Theory

[Python] Bit(비트) 연산, 조작

ju_young 2020. 11. 29. 19:13
728x90

 

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이 나오는 것을 확인할 수 있을 것이다.

 

 

 

비트 연산에 대한 설명은 여기까지만...

728x90

'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