
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으로 채움
- 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바이트의 각 요소별로만 동작이 가능하다.
아래의 예를 보면
- a,b가 결국 1바이트의 데이터로 길이가 1이지만,
- a,b 의 0번 idx의 요소에 대해 bitwise operator를 적용하고
- 이를 다시 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
'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 |