본문 바로가기
Python

[Py] Bitwise Operator

by ds31x 2025. 3. 26.

https://www.omnicalculator.com/math/bitwise

Operandintbool , 또는 byte와 bytesarrays의 각 요소만 사용할 수 있다.

  • bytesbytearrays직접 사용이 안되고 각 요소 단위로 꺼내서 처리해야 한다.

참고로,
Bitwise Operator는
Tensor 등에서 Element-wise로 동작하며
때문에 그 중요도가 매우커짐.

 

 

Python의 Bitwise Operators의 우선순위와 동작은 다음과 같음
(이해를 위해 8비트 기준으로 기재했으나 실제로는 Python의 int가변 길이 정수로 비트 수에 제한이 없다는 점을 명심)

 

Bitwise Operator를 연산자 precedence 에 따라 기재함:

1. ~ (비트 NOT, complement)

  • 각 bit를 반전시킴키 (0을 1로, 1을 0으로)
  • sign bit (MSB) 포함하여 모든 bit 반전
x = 5    # 00000101
print(~x) # 11111010 (-6)

2. <<, >> (시프트 연산자)

2-1. << (왼쪽 시프트)

  • 모든 비트를 왼쪽으로 이동, 오른쪽은 0으로 채움
  • MSB (=sign bit)도 이동
x = -8  # 11111000
print(x << 1)  # 11110000 (-16)

2-2. >> (오른쪽 시프트)

  • 양수: 왼쪽을 0으로 채움
  • 음수: 왼쪽을 1로 채워 sign 유지 (산술 시프트) : C++ 등의 논리 시프트랑은 차이가 남.
x = 8     # 00001000
print(x >> 1)  # 00000100 (4)

y = -8    # 11111000
print(y >> 1)  # 11111100 (-4)

3. & (비트 AND)

  • 두 수의 각 자리 비트를 비교하여 둘 다 1일 때만 1
  • 부호 비트도 동일하게 처리
x = -8    # 11111000
y = 12    # 00001100
print(x & y)  # 00001000 (8)

x = -8    # 11111000
y = -12   # 11110100
print(x & y)  # 11110000 (-16)

4. ^ (비트 XOR , Exclusive OR)

  • 두 수의 각 자리 비트를 비교하여 서로 다를 때 1
  • 부호 비트도 동일하게 처리
x = -8    # 11111000
y = 12    # 00001100
print(x ^ y)  # 11110100 (-12)

5. | (비트 OR , Inclusive OR)

  • 두 수의 각 자리 비트를 비교하여 하나라도 1이면 1
  • 부호 비트도 동일하게 처리
x = -8    # 11111000
y = 12    # 00001100
print(x | y)  # 11111100 (-4)

복합 연산의 예:

# x = -8 (11111000), y = 12 (00001100), z = 7 (00000111)
result = x | y << 2 & z  
# 1. y << 2: 00110000
# 2. (y << 2) & z: 00000000
# 3. x | 0: 11111000 (-8)
  • precedence 를 주의할 것.
  • 명확하게 parentheses 를 사용하는 것이 좋음.

주요 특징:

  • 모든 bitwise operator에서 부호 비트(sign bit, MSB)도 다른 비트들과 동일하게 처리
  • 음수는 2의 보수 형태(2's complement)로 표현됨
  • 연산 결과의 MSB가 1이면 음수, 0이면 양수
  • 시프트 연산에서 음수의 오른쪽 시프트는 항상 1로 채워짐(산술 시프트)

bytes 와 bytearray에서의 동작

binary data를 다루는 bytes 나 bytearray 와 궁합이 좋을 것으로 보통 기대하지만, 생각보다 불편하다.

1바이트의 각 요소별로만 동작이 가능하다.

아래의 예를 보면

  1. a,b가 결국 1바이트의 데이터로 길이가 1이지만,
  2. a,b 의 0번  idx의 요소에 대해 bitwise operator를 적용하고
  3. 이를 다시 bytes로 만드는 작업을 수행해야 한다. 
a = bytes([0b10101010])
b = bytes([0b11001100])
res = bytes([a[0] | b[0]])
print(bin(res[0]))  # 0b11101110

 

여러 바이트 처리는 list comprehension을 사용하여 구현하는게 편하다.

a = bytes([0b11001100, 0b10101010])
b = bytes([0b11110000, 0b00001111])

res = bytes([x & y for x, y in zip(a, b)])
print([bin(byte) for byte in res])
# ['0b11000000', '0b0']

 

같이보면 좋은 자료들

https://dsaint31.tistory.com/516

 

[Python] Arithmetic in Python and Augmented Assignment

1. Precedence of Arithmetic OperationsHigher     ** > -(negation) > * = / = // = % > + = -(subtraction)     Lower우선순위를 기억하는 것도 중요하지만, 헷갈리면 그냥 parentheses로 묶어주면 된다. (가독성을 위해서도

dsaint31.tistory.com

2023.07.28 - [Python] - [Python] Boolean Operators, Relational Operators, and Membership Operator

 

[Python] Boolean Operators, Relational Operators, and Membership Operator

Boolean Operators기본 boolean operator는 다음 3가지로 구성됨.and : and 연산자. (binary op.) : C언어 등에선 &&에 해당.or : or 연산자. (binary op.) : || 에 해당.not : not 연산자. (unary operator로 operand가 하나임.) : !에

ds31x.tistory.com