진법변환 / 비트연산

1 분 소요

이번 포스팅은 자료구조의 진법변환과 비트연산을 정리해보겠습니다.

1.진법변환

진법변환이란?

진법이란? 수를 셀 때 자릿수가 올라가는 단위를 기준으로 하는 셈법의 총칭으로 사용하는 숫자의 개수가 진법의 숫자를 의미합니다. 진법 변환은 말 그대로 우리가 지금쓰고 있는 10진법의 수를 2진법이나, 8진법으로 바꾸는 걸 의미합니다.

진법변환을 왜 사용할까?

CPU는 전기적 신호에 의해 1또는0의 2진법을 사용합니다. 프로그래머들은 메모리에 데이터가 어떻게 저장되어 있는지 알아야 할 필요성이 있기에 2진법으로 표현되어 있는 것을 읽기 쉽도록 우리가 사용하는 10진법이나 주소체계에서 사용되는 16진법 등으로 변환해서 이해할 필요가 있습니다. 따라서 진법변환을 사용하는 이유는 프로그래머가 편하게 내부데이터를 표현하기 위함입니다.

진법변환하기

어떤 수를 n진법으로 변환하려면 그 수를 0이 될 때까지 n으로 나누고, 그 나머지를 거꾸로 읽어 올라가면 됩니다. 예를 들어 다음 그림과 같이 10진수 13을 2진법으로 변환하면 1101이 됩니다.

1

python에서는 10진법 -> 2진법으로 변환할때 bin() 함수를 사용하면 쉽게 변환이 가능합니다. 결과의 b는 binary의 약자 입니다.

bin(13)

‘0b1101’

10진법 -> 8진법은 oct() 함수를 사용합니다. 결과의 o는 octal의 약자 입니다.

oct(95)

‘0o137’

10진법 -> 16진법은 hex()함수를 사용합니다, 결과의 x는 Hex의 약자 입니다.

hex(350)

‘0x15e’

반대로 n진법 -> 10진법으로 변환할때는 모두 int()함수를 사용합니다.

int(0b1101)

13

int(0o137)

95

int(0x15e)

350

2.비트연산

비트연산이란?

비트 연산(bitwise operation)은 한 개 혹은 두 개의 이진수에 대해 비트단위로 적용되는 연산을 말합니다.

비트연산 종류

비트연산에는 AND(&), OR(|), XOR(^), NOT(~), SHIFT(«, »)등 5가지 연산이 있습니다.

AND

AND 연산은 두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때에만 1을, 나머지 경우에는 0을 계산합니다.

비트 1비트 2결과
000
010
000
111
    0101
AND 0011
  = 0001

OR

OR 연산은 두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 계산합니다.

비트 1비트 2결과
000
011
101
111
   0101
OR 0011
 = 0111

XOR

XOR 연산은 두 값의 각 자릿수를 비교해, 값이 같으면 0, 다르면 1을 계산합니다.

비트 1비트 2결과
000
011
101
110
    0101
XOR 0011
  = 0110

NOT

NOT 연산은 각 자릿수의 값을 반대로 바꾸는 연산입니다. 음수의 표현을 처리하기 위함 입니다. NOT 연산은 ‘1을 더한 뒤 부호를 바꿔준다.’ 라고 생각하면 쉽습니다.

a결과
bin(~0b0000)-0b0001
bin(~0b0001)-0b0010
bin(~0b0010)-0b0011
bin(~0b0011)-0b0100
NOT 0111
  = 1000

SHIFT ( « , » )

<< : 비트이동 연산자로 왼쪽으로 주어진 수만큼 옮깁니다.

a결과
bin(0b11<<3)Ob11000
bin(0b1100<<2)0b110000

>> : 비트이동 연산자로 오른쪽으로 주어진 수만큼 옮깁니다.

a결과
bin(0b11>>1)Ob1
bin(0b1100>>2)0b11

비트연산과 십진법

비트연산을 10진법에서 사용하면 어떻게 될까? 컴퓨터는 아래와 같이 10진법을 2진법으로 변환하여 비트연산 후 다시 10진법으로 변환하여 반환해 줍니다.
35 | 5 -> 100011 | 101 -> 100111 -> 39

비트연산 활용

  1. 컴퓨터 연산을 위한 비트 필드
  2. 데이터의 압축 및 암호화
  3. 유한 상태 기계
  4. 컴퓨터 통신을 위한 포트 및 소켓