33. 비트 연산자(Bitwise Operator)
1. 키워드
2. 비트 연산자 사용하기
- 대부분의 프로그래밍 언어는 2진수를 다루는 연산자를 제공한다.
1) 10진수와 2진수 변환하기
- 10진수를 2진수로 된 문자열로 변환할 때는
bin
을 사용한다.
- 반대로 2진수에서 10진수로는 입력 즉시 변환된다.
>>> bin(13) # 10진수 13을 2진수로 변환
'0b1101'
>>> 0b1101 # 2진수 1101을 10진수로 변환
13
- 만약 2진수가 문자열 형태라면
int
에 문자열과 2
를 지정하여 10진수로 변환할 수 있다.
- 그리고 코드에서 2진수를 직접 입력할 때는 맨 앞에
0b
를 붙인다.
>>> int('1101', 2) # 2진수로 된 문자열 1101을 10진수로 변환
13
2) 2진수 표현 방법
- 10진수
13
을 2진수로 표현하면 1101
이 된다.
- 여기서 2진수의 자릿수는 일정한 값을 가지는데 낮은 자릿수부터 2의 거듭제곱 순서로 커진다.
- 따라서
1101
은 8
, 4
, 2
, 1
에서 1
이 위치한 자릿수가 8
, 4
, 1
이므로 8 + 4 + 1 = 13
이다.
3) 비트 논리 연산자 사용하기
- 이제 2진수의 각 자릿수를 AND, OR, XOR, NOT 연산을 하는 비트 논리 연산자를 사용해 보자.
>>> bin(0b1101 & 0b1001)
'0b1001'
>>> 13 & 9
9
>>> bin(0b1101 | 0b1001)
'0b1101'
>>> 13 | 9
13
>>> bin(0b1101 ^ 0b1001)
'0b100'
>>> 13 ^ 9
4
>>> bin(~0b1101)
'-0b1110'
>>> ~13
-14
4) 비트 연산자 진리표
&
, |
, ^
, ~
연산자로 각 비트를 연산했을 때의 결과(진리표)는 다음과 같다.
- 예를 들어
&
연산자는 비트 AND이므로 두 값이 모두 1
일 때 1
이다.
- 따라서 하나라도
0
이면 0
이 나온다.
- 즉,
0b1101
과 0b1001
을 비트 AND 연산했을 때 0 & 1
은 0
그리고 1 & 1
은 1
이 나오므로 0b1001
이 된다.
- 10진수로 표현하면
13 & 9
는 9
가 된다.
>>> bin(0b1101 & 0b1001)
0b1001
>>> 13 & 9
9
- 다음과 같이 비트 논리 연산자는 각 자릿수를 연산하여 결과를 만든다.
- 이때 각 자릿수의 연산 결과는 다른 자릿수에 영향을 미치지 않는다.
5) 시프트 연산자 사용하기
- 시프트 연산자는
<<
또는 >>
다음에 비트를 이동시킬 횟수를 지정한다.
<<
는 비트를 왼쪽으로 이동시키고, >>
는 비트를 오른쪽으로 이동시킨다.
>>> 0b0011 << 2
12
>>> bin(12)
'0b1100'
>>> 0b1100 >> 2
3
>>> bin(3)
'0b11'
- 참고로 비트를 오른쪽으로 이동시켰을 때
1
이 들어갈 공간이 없다면 1
은 사라진다.
- 즉, 계속 비트를 오른쪽으로 이동시키면
1
은 모두 사라지고 최종 결과는 0b0
이 된다.
6) 비트 연산자 목록
References