프로그래밍을 배우다 보면 "0xFF"나 "0b1010" 같은 표기를 만난다. 10진수밖에 모르는 상태에서는 암호처럼 보이지만, 원리를 알면 간단하다. 자릿수를 세는 기준이 다를 뿐이다.
진법이란 무엇인가
숫자를 표현할 때 사용하는 기호의 개수가 진법이다. 우리가 평소에 쓰는 10진법은 0~9까지 10개의 기호를 쓰고, 9 다음에 자릿수가 올라간다. 2진법은 0과 1 두 개만 쓰고, 1 다음에 바로 자릿수가 올라간다.
| 10진수 | 2진수 | 8진수 | 16진수 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 5 | 101 | 5 | 5 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 100 | 1100100 | 144 | 64 |
| 255 | 11111111 | 377 | FF |
16진수에서 A~F가 등장하는 이유는 10 이상의 값을 한 자리에 표현하기 위해서다. A=10, B=11, ... F=15로 대응된다.
어디서 쓰이나
2진수 — 컴퓨터의 언어
컴퓨터는 전기 신호(켜짐/꺼짐)로 동작한다. 0과 1 두 가지 상태뿐이라 모든 데이터를 2진수로 처리한다. 파일 크기가 KB, MB로 표시되는 것도 2진법 기반(1KB = 1024바이트 = 2^10)이다.
16진수 — 색상 코드, 메모리 주소
CSS에서 색상을 지정할 때 #FF5733처럼 쓰는 게 16진수다. 2진수 8자리(1바이트)를 16진수 2자리로 줄여 쓸 수 있어서 가독성이 좋다. 프로그래밍에서 메모리 주소를 표시할 때도 16진수가 표준이다.
8진수 — 리눅스 파일 권한
리눅스에서 chmod 755 같은 명령어를 쓸 때 뒤의 숫자가 8진수다. 7은 2진수 111(읽기+쓰기+실행), 5는 101(읽기+실행)을 의미한다.
변환 원리
10진수 → 2진수
10진수를 2로 계속 나누면서 나머지를 아래에서 위로 읽는다.
13 ÷ 2 = 6 ... 나머지 1
6 ÷ 2 = 3 ... 나머지 0
3 ÷ 2 = 1 ... 나머지 1
1 ÷ 2 = 0 ... 나머지 1
→ 결과: 1101
2진수 → 16진수
2진수를 오른쪽부터 4자리씩 묶으면 16진수 한 자리가 된다.
1111 1111
F F
→ 결과: FF
이 과정을 매번 손으로 하면 번거롭다. 진법 변환기에 숫자를 넣으면 2진수, 8진수, 10진수, 16진수가 동시에 나온다. 2~36진법까지 사용자 정의 변환도 지원하고, 문자를 ASCII 코드로 바꾸는 기능도 있다.
TIP 프로그래밍 시험에서 진법 변환 문제가 자주 나온다. 2진수 ↔ 16진수는 4자리 묶기만 기억하면 되고, 10진수 ↔ 2진수는 나누기 2 반복이 전부다. 원리를 익힌 뒤에는 도구로 검산하면 실수를 줄일 수 있다.
진법은 컴퓨터 과학의 기초 중 기초다. 원리 자체는 초등학교 나눗셈 수준인데, 낯선 표기 때문에 어렵게 느껴지는 것뿐이다.