■ 비트 연산자
컴퓨터는 2진수(0, 1)를 사용하므로 파이썬에서는 2진수를 다루는 연산자를 제공한다. 일단, 10진수를 2진수로 바꾸는 이론적인 방법과 파이썬에서 2진수와 10진수를 변환하는 방법에 대해서 우선적으로 알아본다. 그리고 비트 논리 연산자와 시프트 연산자에 대해 알아볼 것이다.
■ [이론] 10진수 -> 2진수로의 변환
예시를 통해 이해해보도록 한다. 예를 들어 10진수 8을 2진수로 표현하면 1000이 된다. 이를 어떻게 구한 것일까?
몫을 구할 때의 기호를 반대로 뒤집은 듯한 모양으로 몫과 나머지를 반복해서 구해주고 나머지는 몫 옆에 적어준다. 즉, 8을 2로 나눈 몫은 4, 나머지는 0이므로 4 옆에 0을 적어주는 것이다. 이러한 방식을 몫이 1이 될 때까지 반복해서 구해준다. 이렇게 구한 결과를 마지막 몫에서 시작하여 나머지를 반대로 읽어주면 된다. 결국 10진수 8은 2진수로 표현하면 1000이 되는 것이다. 그렇다면 왜 이러한 방식으로 변환을 하는 것이 성립될까?
2진수의 자릿수는 일정한 값을 가지는데 낮은 자릿수부터 2의 거듭제곱 순서(2의 0 제곱부터 시작)로 커진다. 따라서 2진수 1000은 8, 4, 2, 1에서 1이 위치한 자릿수가 8이므로 8이 되는 것이다.
■ 10 -> 2진수 변환 추가 예제
10진수 13을 2진수로 변환하면 1101이 된다. 이 때 8, 4, 2, 1에서 1이 위치한 자릿수가 8, 4, 1이므로 8 + 4 + 1 = 13이 되는 것이다.
■ [Python] 10진수 -> 2진수로의 변환
- 10진수를 2진수로 변환 : bin(정수)
10진수를 2진수로 변환하기 위해서는 bin() 함수를 사용한다.
>>> bin(13)
'0b1101'
10진수 13을 2진수로 변환한 결과인 1101을 즉시 확인할 수 있다.
- 2진수를 10진수로 변환 : int('2진수 문자열', 2)
2진수를 10진수로 변환하기 위해서는 int() 함수를 사용한다. 단 옵션으로 2진수를 의미하는 2를 입력해주어야 한다.
>>> int('1101', 2)
13
■ 비트 논리 연산자
비트 논리 연산자는 2진수의 각 자릿수를 연산을 한다. &, |, ^, ~ 연산자가 있다.
- & : 비트 AND 연산자로 두 값이 모두 1일 때 1이다. 따라서, 하나라도 0이면 0을 반환한다
- | : 비트 OR 연산자로 하나라도 값이 1을 반환한다.
- ^ : 비트 XOR 연산자로 두 수가 서로 다른 값을 가질 때 1을 반환한다.
- ~ : 비트 NOT 연산자로 ~0은 1, ~1은 0을 반환한다.
■ 시프트 연산자
이는 비트의 위치를 이동시키는 시프트 연산자이다. 시프트 연산자는 <<, >>를 지정한 다음 비트를 이동시킬 횟수를 지정한다. 이때 <<는 비트를 왼쪽으로 이동시키고, >>는 비트를 오른쪽으로 이동시킨다.
- << 연산자
>>> bin(0b0011 << 2)
'0b1100'
>>> bin(0b1001 << 1)
'0b10010'
참고로 왼쪽으로 밀어야 하는데 칸이 없다면 칸을 0으로 하나 만들어주면 된다. 이렇게 시프트 연산자를 사용하여 왼쪽으로 한 칸씩 이동할 때마다 2배가 되는 효과가 생긴다.
- >> 연산자
>>> bin(0b0011 >> 2)
'0b0'
>>> bin(0b1001 >> 1)
'0b100'
참고로 비트를 오른쪽으로 이동시킬 때는 오른쪽 끝에 있는 비트는 없어진다고 생각하면 된다. 이렇게 시프트 연산자를 사용하여 오른쪽으로 한 칸씩 이동할 때마다 1/2배가 되는 효과가 생긴다.
'Python > Syntax' 카테고리의 다른 글
[Python] collections 모듈의 defaultdict() (0) | 2022.04.28 |
---|---|
[Python] 문자열 포맷팅 (0) | 2022.04.20 |