프로그래밍을 배우다 보면 0xFF, 0b1010 같은 표기를 만난다. 10진수만 쓰던 입장에서 16진수, 2진수는 외계어처럼 느껴진다. 하지만 원리를 알면 어렵지 않다.
진법이 뭔가
진법(numeral system)은 숫자를 표현하는 체계다. 일상에서 쓰는 10진법은 0~9까지 10개의 숫자를 쓰고, 10이 되면 자릿수가 올라간다. 2진법은 0과 1 두 개만 쓰고, 2가 되면 자릿수가 올라간다. 원리는 같다.
주요 진법 비교
| 10진수 | 2진수 | 8진수 | 16진수 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 5 | 0101 | 5 | 5 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 100 | 1100100 | 144 | 64 |
| 255 | 11111111 | 377 | FF |
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와 같다.
진법 변환은 원리만 이해하면 단순한 규칙의 반복이다. 시험 문제에서 손으로 풀 줄 알아야 할 때도 있지만, 실무에서는 도구로 빠르게 확인하는 게 맞다.