👩🏻‍💻 Computer Science

진법과 진법 변환

iirin 2023. 1. 2. 17:17

진법이란?

진법은 수를 표기하는 기수법의 하나로 임의의 숫자를 사용하여 수를 표현하는 방법이다.

우리는 일상적으로 10진법을 사용하고 있다. 우리에게 주어진 가장 기본적인 수 세기 도구 손가락이 👐 10개라 가장 직관적인 방법이 아닐까?

반면 컴퓨터는 2진법으로 수를 표현한다. 

 

// 2진법 - 10진법
010 (2) == 2 

// 2^3*0 + 2^2*1 + 2^0*0
// 0, 1 한자리씩 == a bit
// 8 bit = 1 byte
  • 프로그래밍에서 많이 사용되는 진법
    1. 2진법
    2. 8진법 : 리눅스나 FTP 등에서 파일/폴더 권한 표현 등
    3. 10진법
    4. 16진법 : 1byte의 크기를 쉽게 표현할 수 있다. 유니코드, 프로그래밍시 변수 주소 값 등

 

🤔 진법을 왜 알아야할까?

진법은 프로그래밍 전반에 걸쳐 사용된다. 프로그래머들이 컴퓨터의 작업, 특히 논리 연산이나 메모리를 이해하는 데 많은 도움을 준다.

 

비트와 비트열

정보를 저장하고 연산을 수행하기 위해 컴퓨터는 비트(bit)라는 측정 단위를 쓴다. 비트는 이진 숫자 'binary digit'의 줄임말로, 그 이름에서 알 수 있듯이 0과 1 두 가지 값만 가질 수 있는 측정 단위이다.

디지털 데이터를 여러 비트들로 나타내며 두 가지 값을 조합하여(비트열) 많은 양의 정보를 저장할 수 있다. 컴퓨터는 비트 연산을 수행함으로써 데이터를 수정한다.

바이트(byte)는 여덟 개의 비트가 모여 만들어진 것이다. 하나의 바이트에 여덟 개의 비트가 있고, 비트 하나는 0과 1로 표현될 수 있기 때문에 2^8 = 256 개의 서로 다른 바이트가 존재할 수 있다.


진법 변환 방법

가장 직관적으로 진법을 이해하는 방법 - CS50

10진법 ➡️ 2진법

실제 수를 변환해봄으로써 법칙을 도출해보자. 예시로 숫자 55를 2진법으로 변환한다면 어떻게 해야할까?

  1. 55를 2로 나누고 그 결과를 몫 27과 나머지 1을 분리하여 기록한다.
  2. 1에서 계산한 몫을 다시 2로 나눈 후, 몫 13과 나머지 1을 기록한다.
  3. 2에서 계산한 몫을 다시 2로 나눈 후, 몫 6과 나머지 1을 기록한다.
  4. 3에서 계산한 몫을 다시 2로 나눈 후, 몫 3과 나머지 0을 기록한다.
  5. 4에서 계산한 몫을 다시 2로 나눈 후, 몫 1과 나머지 1을 기록한다.
  6. 5에서 계산한 몫 1은 더이상 2로 나눌 수 없으므로 종료한다.
  7. 기록한 마지막 몫과 나머지를 아래에서 위로 읽으면 2진수 변환이 끝난다.

 

2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
    1 1 0 1 1 1

 

위의 규칙을 볼 때 10진법에서 N진법으로 수을 변환하는 방법은 주어진 숫자를 N으로 나누며 더이상 몫이 나오지 않을때까지 나눈 후 마지막 몫과 나머지를 거꾸로 읽으면 된다.

위의 실습을 표현하면 다음과 같다.

55 = 2^5*1 + 2^4*1 + 2^3*0 + 2^2*1 + 2^0*1 = 110111 (2)

 

2진법 ➡️ 16진법

16은 2^4이기 때문에 4자리씩 끊어서 변환해주면 된다.

앞서 활용했던 예시인 110111 (2) 의 경우 다음과 같이 변환할 수 있다.

  1. 2진수를 4자리씩 분할하여 읽는다.
  2. 분할한 각 부분을 10진수로 변환한다.
  3. 16진수 표현법에 따라 각 숫자를 변환한다.
1단계
110111 (2) -> 0011 , 0111

2단계
2^1*1 + 2^0*1 = 3
2^2*1 + 2^1*1 + 2^0*1 = 7

3단계
37 (16)

 

✋ 16진법, 어떻게 표현하지?

일상에서 주로 사용하는 숫자는 0부터 9까지의 표현법밖에 없으므로 16진법 표현이 어색할 수 있다.

0~9까지는 10진수와 동일하게 표현하고, 10부터 15까지는 다음과 같이 영문자로 나타낸다.

A B C D E F
10 11 12 13 14 15

 

특수하게 16진수 앞에는 0x 로 16진수임을 표현한다.

0xAC7