# 비트 연산자 : 비트 단위의 연산을 수행하는 연산자
# & 비트 and
# | 비트 or
# ^ 배타적 or
# << 좌측 쉬프트
# >> 우측 쉬프트

# 비트 단위의 연산 : 이진 코드에 대한 연산을 수행한다
# &
# 1 & 1 -> 1
# 1 & 0 -> 0
# 0 & 1 -> 0
# 0 & 0 -> 0
a = 2 & 1    # 2 -> 10(2) : 1*2^1 + 0*2^0 / 1 -> 01(2) : 0*2^1 + 1*2^0
print(a)    # 10 & 01 == 00 -> 0

# |
# 1 | 1 -> 1
# 1 | 0 -> 1
# 0 | 1 -> 1
# 0 | 0 -> 0
a = 2 | 1
print(a)    # 10 | 01 == 11 -> 3

# 음수의 계산은? -> 음수는 2의 보수를 취한다 : 2의 보수 = 00000010 -> 11111101에서 + 1 -> 11111110

# 보수
# 1의 보수 : 0과 1을 반전시키면 된다
# 2의 보수 : 1의 보수에 +1을 한다 -> 파이썬에선, 음수를 계산할 시 2의 보수를 취해서 계산한다
b = -2 | 1
# -2 = 11111110 | 1 = 00000001 == 11111111
# -> 2의 보수를 취한다 -> 00000001 -> -1.
print(b)    # -1

# <<
# 숫자들을 오른쪽으로 이동시킨다
a = 2 << 1    # 00000010 -> 1칸 오른쪽으로 이동 -> 00000100 : 4
print(a)    # 4

b = -2 << 1
# -2 : 00000010 -> 11111101 + 00000001 = 11111110
# 을 1씩 오른쪽으로 보낸다 -> 11111100 -> 00000011 + 000000001 -> 00000100 : -4
print(b)    # -4

# >>
a = 2 >> 1      # 00000010 -> 00000001  : 양수의 경우 shift 시 맨 왼쪽 0
print(a)    # 1
b = -2 >> 1
# -2 : 11111110 : 음수의 경우 shift 시 맨 왼쪽 1
# 을 1씩 왼쪽으로 -> 11111111 -> 00000001 : -1
print(b)    # -1