자릿값 체계란
10진수 4,095에서 4는 4가 아니라 4,000이에요. 천의 자리에 있기 때문이에요. 각 자리는 숫자에 10의 거듭제곱(1, 10, 100, 1,000…)을 곱해요. 이것이 자릿값 체계이고, 진법(기수)은 쓰는 서로 다른 숫자의 개수예요. 10진법은 열 개를 써요.
2진수도 똑같지만 기수가 2예요. 0과 1만 있고 각 자리의 값은 바로 앞 자리의 두 배예요. 16진수는 기수가 16이에요. 열여섯 개의 숫자는 0~9와 알파벳 A~F이고, 각 자리의 값은 앞 자리의 16배예요. 회로는 꺼짐과 켜짐 두 가지 상태만 구별하면 되기 때문에 컴퓨터는 2진수로 동작하고, 16진수는 그 비트를 짧게 적는 방법이에요.
| 자리 (오른쪽부터 왼쪽으로) | 2진수에서의 값 | 16진수에서의 값 |
|---|---|---|
| 1번째 | 1 | 1 |
| 2번째 | 2 | 16 |
| 3번째 | 4 | 256 |
| 4번째 | 8 | 4,096 |
| 5번째 | 16 | 65,536 |
| 6번째 | 32 | 1,048,576 |
| 7번째 | 64 | 16,777,216 |
| 8번째 | 128 | 268,435,456 |
2진수를 10진수로, 손으로 바꾸기
각 숫자에 그 자리의 값을 붙이고, 1이 있는 자리의 값만 더해요. 1101로 해 볼게요. 오른쪽부터 왼쪽으로 자리 값은 1, 2, 4, 8이에요.
- 숫자를 쓰고 그 아래에 각 자리의 값을 적으세요. 1 1 0 1 아래에 8 4 2 1이에요.
- 각 자리에 무엇이 있는지 보세요. 8의 자리에 1, 4의 자리에 1, 2의 자리에 0, 1의 자리에 1이 있어요.
- 0이 있는 자리(여기서는 2의 자리)는 무시하세요.
- 더하세요. 8 + 4 + 0 + 1 = 13이에요. 그래서 2진수 1101은 10진수 13이에요.
자릿수가 더 많아도 똑같아요. 11111111은 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255로, 8비트에 담을 수 있는 가장 큰 값이에요. 10110110은 128 + 32 + 16 + 4 + 2 = 182예요.
10진수를 2진수로, 계속 나누기
수를 2로 계속 나누면서 나머지(항상 0 아니면 1)를 적어요. 몫이 0이 될 때까지 해요. 나머지를 아래에서 위로 읽으면 2진수가 돼요. 45로 해 볼게요.
- 45 ÷ 2 = 22, 나머지 1
- 22 ÷ 2 = 11, 나머지 0
- 11 ÷ 2 = 5, 나머지 1
- 5 ÷ 2 = 2, 나머지 1
- 2 ÷ 2 = 1, 나머지 0
- 1 ÷ 2 = 0, 나머지 1
나머지를 아래에서 위로 읽으면 101101이에요. 확인하려면 더해 보세요. 32 + 8 + 4 + 1 = 45예요.
많은 사람이 더 좋아하는 다른 방법도 있어요. 큰 2의 거듭제곱부터 차례로 빼는 방법이에요. 200이라면 128이 들어가고(72 남음), 64가 들어가고(8 남음), 32와 16은 안 들어가지만 8은 들어가요(0 남음). 쓰인 자리는 128, 64, 8이므로 200 = 11001000이에요.
16진수: 열여섯 개의 숫자와 곁에 두고 볼 표
10~15를 나타내는 숫자가 없으므로 알파벳 A, B, C, D, E, F를 써요. 16진수 한 자리는 정확히 4비트(니블)와 같아요. 그래서 편리해요. 8비트인 1바이트를 16진수 딱 두 자리로 쓸 수 있어요.
16진수를 10진수로 바꾸려면 각 숫자에 그 자리의 16의 거듭제곱을 곱해서 더하세요. 예를 들어 3F = 3 × 16 + 15 = 63이고 A3 = 10 × 16 + 3 = 163이에요.
| 10진수 | 2진수 (4비트) | 8진수 | 16진수 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
16진수를 쓰는 이유: 바이트, 색상, 주소
1바이트는 8비트이고 0~255(00000000~11111111)까지예요. 비트를 손으로 쓰는 건 느리고 실수하기 쉬워요. 16진수로는 같은 바이트가 00~FF 두 글자예요. 2진수를 16진수로 바꾸려면 오른쪽부터 비트를 네 개씩 묶고 각 묶음을 표에 있는 숫자로 바꾸세요. 예를 들어 11010111은 1101과 0111로 나뉘고 각각 D와 7이므로 D7이에요. 10진수로는 13 × 16 + 7 = 215예요.
가장 잘 알려진 사례는 웹 색상이에요. #FF8800에는 바이트가 세 개 있어요. 빨강은 FF(255), 초록은 88(136), 파랑은 00(0)이에요. 빨강은 최대, 초록은 절반을 조금 넘고 파랑은 전혀 없는 선명한 주황색이에요. 16진수는 메모리 주소, 오류 코드, 네트워크 식별자에서도 볼 수 있어요.
ASCII로 텍스트를 2진수로
컴퓨터는 글자 하나하나를 숫자로 저장하고, 그 숫자를 비트로 저장해요. ASCII 표에서 A는 65이고 8비트 2진수로는 01000001이에요. 「Hi」는 두 글자예요. H는 72(01001000), i는 105(01101001)이므로 01001000 01101001이라고 써요. 「Hola」는 72, 111, 108, 97이고 2진수로 01001000 01101111 01101100 01100001, 16진수로는 48 6F 6C 61이에요.
이 도구는 UTF-8 인코딩을 써요. 영어 기본 글자는 글자 하나가 8비트 1바이트지만 ñ, 악센트 글자, 이모지는 여러 바이트를 차지해서 8비트보다 길어요. 한글은 글자 하나가 보통 3바이트예요. 예를 들어 ñ은 2바이트로 11000011 10110001(16진수로 C3 B1)이에요.
도구로 한 번에 해 보기
「2진수·10진수·16진수 변환기」는 손으로 한 계산을 확인하거나 긴 숫자를 실수 없이 풀 때 쓸 수 있어요.
- 해당 진법의 칸에 숫자를 입력하세요. 「10진수 (10진법)」, 「2진수 (2진법)」, 8진수, 「16진수 (16진법)」 중 하나예요. 나머지 세 칸은 자동으로 채워져요.
- 그 진법에 맞지 않는 숫자(2진수에 2를 입력하는 경우 등)를 쓰면 도구가 알려 줘요.
- 텍스트는 「텍스트」 칸에 입력하고 「2진수 (글자당 8비트)」와 바이트별 16진수를 확인하세요. 8비트씩 묶은 비트를 붙여 넣어 텍스트로 되돌릴 수도 있어요.
- 특이한 진법은 「모든 진법 (2~36)」을 쓰세요. 변환 전 진법, 변환 후 진법, 숫자를 고르면 돼요.
한계도 있어요. 음수가 아닌 정수만 변환하고(소수점이나 부호 없이), 앞에 0을 자동으로 채워 주지 않아요. 8비트 고정이 필요하다면 직접 채워야 해요(13은 00001101). 입력한 내용은 브라우저 밖으로 나가지 않아요.
자주 하는 실수
- 나머지를 거꾸로 읽기: 계속 나눌 때 첫 번째 나머지가 가장 오른쪽 자리 숫자예요. 가장 왼쪽이 아니에요.
- 필요한 앞자리 0을 빼먹기: 13은 1101이지만 바이트로는 00001101이에요. 색상이나 네트워크 마스크처럼 길이가 데이터의 일부일 때 중요해요.
- 복사할 때 알파벳 O와 숫자 0, 16진수 B(11)와 숫자 8을 혼동하기: 16진수에서 알파벳은 대문자든 소문자든 값이 같지만 숫자와는 달라요.
- 변환할 때 0x 접두어나 # 기호를 그대로 두기: 16진수라는 표시일 뿐이라 붙여 넣기 전에 지워야 해요.
- 2진수 10을 열이라고 생각하기: 2예요. 같은 「10」이 진법에 따라 2, 10, 16이 돼요.
연습 문제와 풀이
답을 보기 전에 직접 풀어 보고, 풀고 나서 도구로 확인하세요.
- 10110110을 10진수와 16진수로 바꿔 보세요. 답: 128 + 32 + 16 + 4 + 2 = 182이고, 네 개씩 묶으면 1011 0110 = B6이에요.
- 200을 2진수와 16진수로 바꿔 보세요. 답: 11001000과 C8(12 × 16 + 8 = 200)이에요.
- 7F를 2진수로 바꿔 보세요. 답: 7 = 0111, F = 1111이므로 01111111이고, 10진수로는 127이에요.
- 「OK」를 2진수로 써 보세요. 답: O는 79, K는 75이므로 01001111 01001011이에요.
자주 묻는 질문
2진수 1101을 10진수로 어떻게 바꾸나요?
1이 있는 자리의 값을 더해요. 8 + 4 + 1 = 13이에요. 오른쪽에서 두 번째 숫자는 0이라서 2는 더하지 않아요.
255는 2진수와 16진수로 얼마예요?
255는 2진수로 11111111, 16진수로 FF예요. 8비트 1바이트에 담을 수 있는 가장 큰 값이에요.
16진수는 왜 알파벳을 쓰나요?
서로 다른 기호가 열여섯 개 필요한데 10진법에서는 열 개(0~9)만 쓸 수 있기 때문이에요. 그래서 A는 10, B는 11, C는 12, D는 13, E는 14, F는 15예요.
8비트로 서로 다른 수를 몇 개 쓸 수 있나요?
0부터 255까지 256개예요. 일반적으로 n비트로는 2의 n제곱 개의 값을 나타낼 수 있어요.
도구가 음수나 소수도 변환하나요?
아니요, 음수가 아닌 정수만 변환해요. 텍스트는 UTF-8을 쓰기 때문에 악센트 글자와 이모지는 8비트보다 길게 나와요.