47.1 비트 연산자 사용하기

Unit 47. 부록

이제부터 부록입니다. 부록은 참고삼아 알아둘 내용, 자주 사용하지 않는 기능, 내용이 다소 어려운 부분, 파이썬을 어느 정도 알고난 뒤에 봐야할 내용 등을 담았습니다. 여기에 나오는 내용을 모두 익힐 필요는 없으며 필요할 때마다 찾아보면 됩니다.

47.1 비트 연산자 사용하기

컴퓨터는 2진수(0과 1)를 사용하므로 대부분의 프로그래밍 언어는 2진수를 다루는 연산자를 제공합니다. 그런데 2진수로 변환하는 방법을 잘 모른다면 어떻게 해야 할까요? 걱정하지 않아도 됩니다. 파이썬에서는 간단하게 2진수와 10진수를 서로 변환할 수 있습니다.

47.1.1  10진수와 2진수 변환하기

10진수를 2진수로 된 문자열로 변환할 때는 bin을 사용합니다. 반대로 2진수에서 10진수로는 입력 즉시 변환됩니다.

  • bin(정수)
>>> bin(13)    # 10진수 13을 2진수로 변환
'0b1101'
>>> 0b1101     # 2진수 1101을 10진수로 변환
13

만약 2진수가 문자열 형태라면 int에 문자열과 2를 지정하여 10진수로 변환할 수 있습니다. 그리고 코드에서 2진수를 직접 입력할 때는 맨 앞에 0b를 붙입니다(binary의 b).

  • int('2진수문자열', 2)
>>> int('1101', 2)    # 2진수로 된 문자열 1101을 10진수로 변환
13

47.1.2  2진수 표현 방법

10진수 13을 2진수로 표현하면 1101이 됩니다. 여기서 2진수의 자릿수는 일정한 값을 가지는데 낮은 자릿수부터 2의 거듭제곱 순서로 커집니다(20부터 시작). 따라서 1101은 8, 4, 2, 1에서 1이 위치한 자릿수가 8, 4, 1이므로 8 + 4 + 1 = 13입니다.

그림 47-1 13을 2진수로 표현

47.1.3  비트 논리 연산자 사용하기

이제 2진수의 각 자릿수를 AND, OR, XOR, NOT 연산을 하는 비트 논리 연산자를 사용해보겠습니다.

  • a & b
  • a | b
  • a ^ b
  • ~x
>>> bin(0b1101 & 0b1001)    # 비트 AND
'0b1001'
>>> 13 & 9                  # 비트 AND
9
>>> bin(0b1101 | 0b1001)    # 비트 OR
'0b1101'
>>> 13 | 9                  # 비트 OR
13
>>> bin(0b1101 ^ 0b1001)    # 비트 XOR
'0b100'
>>> 13 ^ 9                  # 비트 XOR
4
>>> bin(~0b1101)            # 비트 NOT
'-0b1110'
>>> ~13                     # 비트 NOT
-14

47.1.4  비트 연산자 진리표

&, |, ^, ~ 연산자로 각 비트를 연산했을 때의 결과(진리표)는 다음과 같습니다. 진리표의 내용이 많아 보여도 각 연산자의 특성만 이해하면 진리표 전체를 외우지 않아도 됩니다.

표 47-1 &, |, ^, ~의 연산 결과

연산자

비트1

비트2

결과

&

0

0

0

0

1

0

1

0

0

1

1

1

|

0

0

0

0

1

1

1

0

1

1

1

1

^

0

0

0

0

1

1

1

0

1

1

1

0

~

0

 

1

1

 

0

예를 들어 & 연산자는 비트 AND이므로 두 값이 모두 1일 때 1입니다. 따라서 하나라도 0이면 0이 나옵니다. 즉, 0b11010b1001을 비트 AND 연산했을 때 0 & 10 그리고 1 & 11이 나오므로 0b1001이 됩니다. 10진수로 표현하면 13 & 9는 9가 되겠죠?

>>> bin(0b1101 & 0b1001)
0b1001
>>> 13 & 9
9

다음과 같이 비트 논리 연산자는 각 자릿수를 연산하여 결과를 만듭니다. 이때 각 자릿수의 연산 결과는 다른 자릿수에 영향을 미치지 않습니다.

그림 47-2 비트 단위 연산

47.1.5  시프트 연산자 사용하기

이번에는 비트의 위치를 이동시키는 시프트 연산자입니다. 시프트 연산자는 << 또는 >> 다음에 비트를 이동시킬 횟수를 지정합니다. <<는 비트를 왼쪽으로 이동시키고, >>는 비트를 오른쪽으로 이동시킵니다.

  • a << b
  • a >> b
>>> 0b0011 << 2    # 비트를 왼쪽으로 2번 이동
12
>>> bin(12)
'0b1100'
>>> 0b1100 >> 2    # 비트를 오른쪽으로 2번 이동
3
>>> bin(3)
'0b11'

참고로 비트를 오른쪽으로 이동시켰을 때 1이 들어갈 공간이 없다면 1은 사라집니다. 즉, 계속 비트를 오른쪽으로 이동시키면 1은 모두 사라지고 최종 결과는 0b0이 됩니다. 여러분들이 직접 실행해보세요.

47.1.6  비트 연산자 목록

다음은 파이썬의 비트 연산자입니다.

표 47-2 파이썬 비트 연산자

연산자

기능

문법

설명

&

비트 AND

a & b

ab의 비트를 AND 연산

|

비트 OR

a | b

ab의 비트를 OR 연산

^

비트 XOR

a ^ b

ab의 비트를 XOR 연산(배타적 OR, Exclusive OR)

~

비트 NOT

~x

x의 비트를 뒤집음

<< 

비트 왼쪽 시프트

a << b

a의 비트를 b번 왼쪽으로 이동시킴

>> 

비트 오른쪽 시프트

a >> b

a의 비트를 b번 오른쪽으로 이동시킴

&=

비트 AND 연산 후 할당

a &= b

ab의 비트를 AND 연산한 후 결과를 a에 할당

|=

비트 OR 연산 후 할당

a |= b

ab의 비트를 OR 연산한 후 결과를 a에 할당

^=

비트 XOR 연산 후 할당

a ^= b

ab의 비트를 XOR 연산한 후 결과를 a에 할당

<<=

비트 왼쪽 시프트 후 할당

a <<= b

a의 비트를 b번 왼쪽으로 이동시킨 후 결과를 a에 할당

>>=

비트 오른쪽 시프트 후 할당

a >>= b

a의 비트를 b번 오른쪽으로 이동시킨 후 결과를 a에 할당