
Operand로 int 와 bool , 또는 byte와 bytesarrays의 각 요소 (각 요소가 중요!!)만 사용할 수 있다.
bytes나bytearrays는 직접 사용이 안되고 각 요소 단위로 꺼내서 처리해야 한다.
참고로,
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으로 채움
- 2배가 된다고 생각하면 편함 (부호, sign이 유지됨 )
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바이트의 각 요소별로만 동작이 가능하다.
아래의 예를 보면
- a, b가 결국 1바이트의 데이터로 길이가 1이지만,
- a, b 의 0번 idx의 요소에 대해 bitwise operator를 적용하고
- 이를 다시 bytes로 만드는 작업을 수행해야 한다 (즉, 각 비트별로 elementwise 연산을 해야함...).
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
위 그림에서 arithmetic operators는 제외됨.https://dsaint31.tistory.com/516 -(negation) > * = / = // = % > + = -(subtraction) Lower우선순위를 기억하는 것도 중요하지만, 헷갈리면 그냥 parentheses로 묶어주면 된다. (가독
ds31x.tistory.com
'Python' 카테고리의 다른 글
| [Py] print 함수 (0) | 2025.04.02 |
|---|---|
| [PyTorch] autograd 심화: grad_fn 과 custom operation 만들기 (0) | 2025.03.28 |
| [Py] 객체(object)에 대한 정보 확인하기 (0) | 2025.03.19 |
| [Ex] Numeric Datatype 다음의 연산들의 결과를 구해보고 그 이유를 설명해보라. (0) | 2025.03.17 |
| [PyTorch] dtype 단축메서드로 바꾸기 (0) | 2025.03.14 |