유틸리티

진법 변환 원리와 2진수, 8진수, 10진수, 16진수 변환법

프로그래밍을 배우다 보면 0xFF, 0b1010 같은 표기를 만난다. 10진수만 쓰던 입장에서 16진수, 2진수는 외계어처럼 느껴진다. 하지만 원리를 알면 어렵지 않다.

진법이 뭔가

진법(numeral system)은 숫자를 표현하는 체계다. 일상에서 쓰는 10진법은 0~9까지 10개의 숫자를 쓰고, 10이 되면 자릿수가 올라간다. 2진법은 0과 1 두 개만 쓰고, 2가 되면 자릿수가 올라간다. 원리는 같다.

주요 진법 비교

10진수2진수8진수16진수
0000000
5010155
10101012A
15111117F
100110010014464
25511111111377FF

16진수에서 10~15를 나타낼 숫자가 부족하므로 A(10), B(11), C(12), D(13), E(14), F(15)를 사용한다.

어디에 어떤 진법이 쓰이나

2진수 (Binary)
컴퓨터 내부의 기본 언어다. 모든 데이터는 결국 0과 1의 조합으로 저장된다. 비트 연산, 네트워크 서브넷 마스크 계산에서 직접 다루게 된다.
8진수 (Octal)
리눅스 파일 권한(chmod 755)에서 주로 쓰인다. 3비트를 한 자리로 묶어 표현하기 편하기 때문이다.
16진수 (Hexadecimal)
가장 자주 마주치는 진법이다. 색상 코드(#FF5733), 메모리 주소, MAC 주소, 유니코드 문자 표기 등에 쓰인다. 4비트를 한 자리로 표현해서 2진수보다 훨씬 짧다.

손으로 변환하는 법

10진수 → 2진수

목표 숫자를 2로 계속 나누면서 나머지를 기록한다. 나머지를 아래에서 위로 읽으면 2진수가 된다.

13 ÷ 2 = 6 ... 나머지 1
 6 ÷ 2 = 3 ... 나머지 0
 3 ÷ 2 = 1 ... 나머지 1
 1 ÷ 2 = 0 ... 나머지 1
→ 1101

2진수 → 16진수

2진수를 뒤에서부터 4자리씩 끊고, 각 묶음을 16진수 한 자리로 바꾸면 된다.

1010 1111
  A    F
→ AF

손 계산이 번거로울 때는 진법 변환기에 숫자를 넣으면 2진수, 8진수, 10진수, 16진수가 동시에 나온다. 2~36진법까지 사용자 지정 변환도 되고, 문자를 입력하면 ASCII 코드도 확인할 수 있다.

TIP 프로그래밍 언어에서 진법을 구분하는 접두어가 있다. 0b는 2진수, 0o는 8진수, 0x는 16진수다. Python이나 JavaScript에서 0xFF라고 쓰면 10진수 255와 같다.

진법 변환은 원리만 이해하면 단순한 규칙의 반복이다. 시험 문제에서 손으로 풀 줄 알아야 할 때도 있지만, 실무에서는 도구로 빠르게 확인하는 게 맞다.