프로그래밍 수업에서 "255를 2진수로 바꿔보세요"라는 문제가 나왔다. 나누기를 반복해서 풀 수는 있는데, 시험장에서 손으로 계산하면 실수하기 쉽고 시간도 오래 걸린다. 진법 변환은 원리만 이해하면 패턴이 보이기 시작한다.
진법이란
숫자를 표현하는 체계다. 우리가 일상에서 쓰는 건 10진법(0~9), 컴퓨터가 내부에서 쓰는 건 2진법(0, 1)이다.
| 진법 | 사용 숫자 | 주요 용도 |
|---|---|---|
| 2진수 | 0, 1 | 컴퓨터 내부 연산, 비트 처리 |
| 8진수 | 0~7 | 리눅스 파일 권한 (chmod 755) |
| 10진수 | 0~9 | 일상 숫자, 수학 |
| 16진수 | 0~9, A~F | 메모리 주소, 색상 코드(#FF0000) |
10진수 → 2진수 변환 원리
10진수를 2로 계속 나누면서 나머지를 아래에서 위로 읽으면 된다.
예시: 13을 2진수로
13 ÷ 2 = 6 ... 나머지 1
6 ÷ 2 = 3 ... 나머지 0
3 ÷ 2 = 1 ... 나머지 1
1 ÷ 2 = 0 ... 나머지 1
→ 아래에서 위로 읽으면: 1101
같은 원리로 10진수를 8이나 16으로 나누면 8진수, 16진수로 변환할 수 있다.
2진수 → 10진수 변환
각 자릿수에 2의 거듭제곱을 곱해서 더하면 된다.
예시: 1101을 10진수로
1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1 = 13
16진수가 프로그래밍에서 많이 쓰이는 이유
2진수 4자리가 16진수 1자리와 정확히 대응하기 때문이다.
| 2진수 | 16진수 | 10진수 |
|---|---|---|
| 0000 | 0 | 0 |
| 0101 | 5 | 5 |
| 1010 | A | 10 |
| 1111 | F | 15 |
| 1111 1111 | FF | 255 |
255를 2진수로 쓰면 11111111(8자리)이지만, 16진수로 쓰면 FF(2자리)로 훨씬 간결하다. 메모리 주소나 색상 코드처럼 긴 2진수를 다룰 때 16진수가 편한 이유다.
자주 쓰는 변환 값 외우기
- 255 = FF(16) = 11111111(2) → 1바이트 최대값
- 256 = 100(16) = 100000000(2) → 색상 채널 범위 (0~255)
- 1024 = 400(16) = 10000000000(2) → 1KB
- 65535 = FFFF(16) → 2바이트(16비트) 최대값
빠르게 변환하려면
시험 문제가 아니라 실무에서 필요한 거라면 손으로 나누기를 할 이유가 없다. 진법 변환기에 아무 진법의 값을 넣으면 2진수, 8진수, 10진수, 16진수가 동시에 표시된다. 2~36진법 사이의 사용자 정의 변환도 가능하고, ASCII 문자의 코드값도 확인할 수 있다.
진법 변환의 원리는 "나누고 나머지를 읽는 것" 하나다. 원리를 한 번 이해하면 몇 진법이든 같은 방식으로 접근할 수 있다.