비트 연산 : 파이썬으로 비트 연산

들어가며

연산자는 참으로 많습니다. 산술 연산자, 삼항 연산자, 비교 연산자, 단항 연산자, 할당 연산자 등 처음 코딩을 배우면 연산자만 배우는 데도 버겁습니다. 그런데 “비트 연산자” 라는 녀셕이 또 등장하네요. 비트란 무엇이고 비트 연산은 어떤 거고 언제 쓰이는 걸까요? 그리고 “파이썬으로 비트 연산” 은 어떻게 하는 걸까요?

비트? 비트 연산?

비트는 0 또는 1이 될 수 있는 이진수를 나타내는 가장 작은 데이터 단위입니다. 비트는 디지털 시스템에서 정보를 표현하고 처리하기 위한 기본 구성 요소 역할을 합니다.

파이썬에서 비트는 0b를 앞으로 붙여서 표현합니다

num = 0b101010  # 101010 이진수를 의미합니다.

십진수를 이진수로 표현하기 위해서는 bin 함수를 사용합니다.

print(bin(10))  # 0b1010

bin() 함수

bin() 함수는 정수를 ‘0b’라는 접두사가 붙은 문자열로 이진 표현으로 변환하는 데 사용됩니다. 작동 방식은 다음과 같습니다.

num = 10
binary_str = bin(num)
print(binary_str)  # Output: '0b1010'

이 예에서는 정수 ’10’이 이진수 표현인 ‘1010’으로 변환됩니다. bin() 함수는 이 이진 표현을 접두사 ‘0b’가 있는 문자열로 반환합니다.

또한 밑이 2인 int() 함수를 사용하여 이진 문자열을 다시 정수로 변환할 수도 있습니다.

binary_str = '0b1010'
num = int(binary_str, 2)
print(num)  # Output: 10

비트 연산은 컴퓨터에서 비트 단위로 수행되는 연산입니다. 이 연산은 이진수를 다룰 때 사용되며, 각 비트의 상태에 따라 논리적인 계산을 수행합니다.

비트 연산 이점

“갑자기 비트 연산을 왜 하나요” 싶습니다. 이유는 비트 연산이 주는 이점이 있기 때문입니다.

비트 연산자는 특히 하위 수준 연산 및 비트 조작 작업을 처리할 때 다른 일반 연산자를 사용하는 것보다 속도 향상을 제공할 수 있는 경우가 많습니다.

비트 연산자가 빠른 이유

비트 연산은 하드웨어에서 직접 지원되는 경우가 많습니다.

이진 수준에서 더 간단한 연산이 포함되므로 더 복잡한 계산이나 함수 호출이 필요할 수 있는 상위 수준 연산에 비해 오버헤드가 줄어듭니다.

비트 연산은 종종 CPU에 의해 병렬화되어 여러 작업을 동시에 수행할 수 있습니다. 이로 인해 특히 최신 멀티 코어 프로세서에서 실행 속도가 빨라질 수 있습니다.

비트 연산 종류

일반적으로 사용되는 비트 연산자에는 AND(&), OR(|), XOR(^), NOT(~) 등이 있습니다. 각 연산자의 동작은 다음과 같습니다

& : AND 연산

각 자리수의 두 비트가 모두 1인 경우에만 결과 비트가 1이 됩니다. 그 외의 경우는 0이 됩니다.

예를 들어, 1010 & 1100의 결과는 1000입니다.

| : OR 연산

각 자리수의 두 비트 중 하나 이상이 1인 경우 결과 비트가 1이 됩니다. 두 비트가 모두 0인 경우에만 결과 비트가 0이 됩니다.

예를 들어, 1010 | 1100의 결과는 1110입니다.

^ : XOR 연산

각 자리수의 두 비트가 서로 다른 경우에만 결과 비트가 1이 됩니다. 두 비트가 모두 같은 경우에는 결과 비트가 0이 됩니다.

예를 들어, 1010 ^ 1100의 결과는 0110입니다.

~ : NOT 연산 (보수 연산)

비트를 반전시킵니다. 1은 0으로, 0은 1로 변환됩니다.

예를 들어, ~1010의 결과는 0101입니다.

<< : 비트 왼쪽 시프트

비트를 왼쪽으로 이동 시킵니다.

한번 왼쪽으로 비트를 이동할 때마다 결과적으로 숫자에 2가 곱해집니다.

num = 5  # 이진수: 101
result = num << 2  #  'num'을 왼쪽으로 2번 옮김 -> 10100
print(result)  # Output: 20

>> : 비트 오른쪽 시프트

비트를 오른쪽으로 이동 시킵니다.

한번 오른쪽으로 비트를 이동할 때마다 결과적으로 숫자에 2가 나눠 집니다.

num = 20  # 이진수: 10100
result = num >> 2  #  'num'을 왼쪽으로 2번 옮김 -> 이진수 101
print(result)  # 101 => 5
num = 15  # 이진수: 1111
result = num >> 2  # 'num'을 왼쪽으로 2번 옮김 -> 이진수 11
print(result)  # 11 => 3

비트 연산이 사용되는 상황

비트 연산은 주로 다음과 같은 상황에서 사용됩니다:

  • 이진수 내의 개별 비트 조작하여 플래그 설정
  • 비트마스크를 사용한 데이터 필터링 또는 선택
  • 데이터의 압축 또는 암호화 알고리즘에서 사용

파이썬에서 비트 연산 활용하기

비트 설정 및 지우기

비트별 OR(|)를 사용하여 정수의 특정 비트를 설정하고 비트별 AND(&)를 보수(~) 연산자와 함께 사용하여 비트를 지울 수 있습니다.

# 셋째 자리 비트를 1로 설정하기
num = 10  # Binary: 1010
num |= (1 << 2)  # Set the 3rd bit
print(bin(num))  # Output: 0b1110

# 둘째 자리 비트를 0으로 설정하기
num &= ~(1 << 1)  # Clear the 2nd bit ~(1 << 1)가 왜 -0b11?
print(bin(num))   # Output: 0b1100

파이썬에서 정수는 보통 부호있는 2의 보수 표현을 사용합니다. 즉, 가장 왼쪽 비트는 부호 비트로 사용됩니다.

이 경우 0b01은 양수 1이 아니라 음수 -1을 나타냅니다.

비트가 설정되었는지 확인

비트별 AND(&)를 사용하여 특정 비트가 정수로 설정되어 있는지 확인할 수 있습니다.

# Check if the 4th bit (counting from 0) of an integer is set
num = 13  # Binary: 1101
if num & (1 << 3):  # Check the 4th bit
    print("Bit is set")
else:
    print("Bit is not set")

짝수 또는 홀수 확인

숫자가 짝수인지 홀수인지 확인하려면 비트 단위 AND(&)를 1과 함께 사용할 수 있습니다.

10은 이진수로 1010
1은 이진수로 0001
1010 과 0001을 & 연산하면 0000이 됩니다.

9를 이진수로 나타난다면 1001
1은 이진수로 0001
1001과 0001을 & 연산하면 0001이 됩니다.

짝수와 홀수를 이진수로 1과 &를 하면 짝수는 0되고 홀수는 1이 됨을 알 수 있습니다.

# Check if a number is even or odd
num = 10
if num & 1:
    print("Number is odd")
else:
    print("Number is even")

마치며

파이썬은 사실 고수준의 언어이며 임베디드 시스템에 사용하는 언어가 아니기 때문에 비트 연산을 과연 많이 쓸 일이 있을까 싶었습니다.

하지만 공부를 해보니 재귀나 대규모 데이터에서 반복 연산이 들어가는 경우에는 큰 도움이 되지 않을까 싶었습니다.

잘 정리 해 놓고 나중에 꼭 쓸 일들이 있기를…!

참고하면 좋은 글

Leave a Comment

목차