프로그래밍 수업에서 "255를 2진수로 바꿔라"는 문제가 나왔을 때, 나누기를 반복하다가 실수하는 경우가 많다. 진법 변환은 원리 자체는 단순한데, 손으로 하면 자릿수가 늘어날수록 실수가 쌓인다.
진법이란, 왜 여러 종류가 있는가
일상에서 쓰는 숫자는 10진법이다. 0부터 9까지 10개 숫자를 쓴다. 컴퓨터는 전기 신호의 켜짐/꺼짐만 인식하므로 2진법(0과 1)을 쓴다. 16진법은 2진수를 짧게 표기하기 위해 만든 것이다.
| 진법 | 사용 숫자 | 쓰이는 곳 |
|---|---|---|
| 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
16진수도 같은 원리인데 2 대신 16으로 나눈다. 나머지가 10 이상이면 A(10), B(11), C(12), D(13), E(14), F(15)로 표기한다.
자주 나오는 변환 값 정리
| 10진수 | 2진수 | 8진수 | 16진수 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 100 | 1100100 | 144 | 64 |
| 127 | 1111111 | 177 | 7F |
| 255 | 11111111 | 377 | FF |
255는 1바이트(8비트)로 표현할 수 있는 최대값이다. 색상 코드에서 RGB 각 채널의 최대값이 255인 이유이기도 하다.
직접 계산하기 귀찮다면
시험이나 과제가 아니라면 직접 나누기를 반복할 필요가 없다. 진법 변환기에 숫자를 입력하면 2진수, 8진수, 10진수, 16진수가 동시에 표시된다. 2~36진법까지 사용자 정의 변환도 되고, 문자를 넣으면 ASCII 코드값도 바로 나온다.
TIP 프로그래밍 언어에서는 접두어로 진법을 구분한다. 0b는 2진수(0b1101), 0o는 8진수(0o15), 0x는 16진수(0xFF). 코드에서 이 접두어를 보면 바로 어떤 진법인지 알 수 있다.
원리를 한 번 이해해두면 진법 변환 문제는 패턴이 보인다. 실무에서는 도구를 쓰면 되고, 시험에서는 나누기만 정확하게 하면 된다.