진법이란?
진법은 수를 표기하는 기수법의 하나로 임의의 숫자를 사용하여 수를 표현하는 방법이다.
우리는 일상적으로 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
- 프로그래밍에서 많이 사용되는 진법
- 2진법
- 8진법 : 리눅스나 FTP 등에서 파일/폴더 권한 표현 등
- 10진법
- 16진법 : 1byte의 크기를 쉽게 표현할 수 있다. 유니코드, 프로그래밍시 변수 주소 값 등
🤔 진법을 왜 알아야할까?
진법은 프로그래밍 전반에 걸쳐 사용된다. 프로그래머들이 컴퓨터의 작업, 특히 논리 연산이나 메모리를 이해하는 데 많은 도움을 준다.
비트와 비트열
정보를 저장하고 연산을 수행하기 위해 컴퓨터는 비트(bit)라는 측정 단위를 쓴다. 비트는 이진 숫자 'binary digit'의 줄임말로, 그 이름에서 알 수 있듯이 0과 1 두 가지 값만 가질 수 있는 측정 단위이다.
디지털 데이터를 여러 비트들로 나타내며 두 가지 값을 조합하여(비트열) 많은 양의 정보를 저장할 수 있다. 컴퓨터는 비트 연산을 수행함으로써 데이터를 수정한다.
바이트(byte)는 여덟 개의 비트가 모여 만들어진 것이다. 하나의 바이트에 여덟 개의 비트가 있고, 비트 하나는 0과 1로 표현될 수 있기 때문에 2^8 = 256 개의 서로 다른 바이트가 존재할 수 있다.
진법 변환 방법
10진법 ➡️ 2진법
실제 수를 변환해봄으로써 법칙을 도출해보자. 예시로 숫자 55를 2진법으로 변환한다면 어떻게 해야할까?
- 55를 2로 나누고 그 결과를 몫 27과 나머지 1을 분리하여 기록한다.
- 1에서 계산한 몫을 다시 2로 나눈 후, 몫 13과 나머지 1을 기록한다.
- 2에서 계산한 몫을 다시 2로 나눈 후, 몫 6과 나머지 1을 기록한다.
- 3에서 계산한 몫을 다시 2로 나눈 후, 몫 3과 나머지 0을 기록한다.
- 4에서 계산한 몫을 다시 2로 나눈 후, 몫 1과 나머지 1을 기록한다.
- 5에서 계산한 몫 1은 더이상 2로 나눌 수 없으므로 종료한다.
- 기록한 마지막 몫과 나머지를 아래에서 위로 읽으면 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) 의 경우 다음과 같이 변환할 수 있다.
- 2진수를 4자리씩 분할하여 읽는다.
- 분할한 각 부분을 10진수로 변환한다.
- 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
- 🔗 이 블로그 연관 글
- 🙏 참고한 자료
- 코드스쿼드 CS16 교육 자료
- (상식) 컴퓨터에서 2진수, 8진수, 16진수를 쓰게 된 이유
- CS50 Lecture 1
- TCP school 진법