진법은 같은 수를 몇 개의 숫자로 적느냐의 차이입니다
진법은 한 자리에 쓰는 숫자의 개수입니다. 10진법은 0~9 열 개로 적고 자리가 하나 올라갈 때마다 값이 10배가 되며, 2진법은 0과 1 두 개로 적고 자리마다 2배가 됩니다. 그래서 255는 10진수로 세 자리지만 2진수로는 1111 1111 여덟 자리, 16진수로는 FF 두 자리입니다. 값은 같고 적는 방식만 다릅니다.
이 도구는 2·8·10·16진수 칸과 직접 고르는 진법 칸(2~36진법)을 나란히 두고, 어느 칸에 넣어도 나머지 칸을 바로 다시 적습니다. 정수뿐 아니라 음수와 소수, 1,000자리 큰 수도 반올림 없이 바꾸고, 2진수로 끝나지 않는 소수는 되풀이되는 부분을 괄호로 표시합니다. 아래의 비트판과 풀이는 컴퓨터가 그 수를 어떻게 저장하는지, 손으로는 어떻게 바꾸는지를 보여 줍니다.
진법을 바꿔야 하는 상황
사람은 10진수로 세지만 컴퓨터는 모든 값을 0과 1의 비트로 저장합니다. 비트를 그대로 읽기에는 너무 길어서, 프로그래머는 비트 4개를 16진수 한 자리로, 비트 3개를 8진수 한 자리로 줄여 적습니다. 그래서 아래와 같은 일을 할 때 진법을 오가게 됩니다.
- 색 코드: CSS 색
#1E90FF는 16진수 두 자리씩 빨강·초록·파랑의 세기를 나타냅니다. 00이 가장 약하고 FF(10진수 255)가 가장 강하며, 1E는 30, 90은 144입니다. - 파일 권한: 리눅스의
chmod 755에서 각 자리는 8진수이고, 2진수 세 자리로 읽기(4)·쓰기(2)·실행(1)을 켜고 끕니다. 7은 111이라 읽기·쓰기·실행이 모두 켜지고, 5는 101이라 쓰기만 꺼집니다. - 네트워크: 서브넷 마스크 255.255.255.0은 네 칸이 각각 8비트라서 2진수로 바꾸면 1이 24개, 0이 8개입니다. 그래서 같은 마스크를 /24로 줄여 씁니다.
- 메모리와 바이트: 1바이트(8비트)는 16진수 두 자리(00~FF)에 꼭 맞습니다. 메모리 주소, 해시값, 파일 내용을 들여다볼 때 16진수로 보는 이유입니다.
- 음수 해석: 컴퓨터의 정수 변수는 −5를 부호와 5로 나눠 저장하지 않고, 8비트라면 1111 1011 같은 2의 보수 패턴으로 저장합니다. 통신 기록에서 FB를 보고 그것이 −5인지 251인지 가려야 할 때 폭과 부호를 함께 따져야 합니다.
- 소수 오차: 0.1은 2진수로 끝나지 않아 컴퓨터는 가장 가까운 값으로 반올림해 저장합니다. 그래서 JavaScript에서 0.1 + 0.2를 계산하면 0.3이 아니라 0.30000000000000004가 나옵니다.
- 수학 숙제: 5진법이나 3진법처럼 10이 아닌 진법으로 수를 적고 바꾸는 문제는 나눗셈과 자리값으로 풉니다. 풀이 칸이 그 과정을 그대로 보여 줍니다.
쓰는 법
- 원래 수가 적힌 진법의 칸에 수를 넣습니다. 16진수 FF라면 16 칸에, 2진수 1010이라면 2 칸에 넣으면 나머지 칸이 바로 바뀝니다.
- 3진법·5진법·36진법처럼 다른 진법은 다섯째 칸 왼쪽에서 진법(2~36)을 고른 뒤 넣습니다.
- 음수는 앞에 −를 붙이고, 소수점은 마침표(.)로 적습니다. 되풀이되는 소수는 0.1(6)처럼 반복 부분을 괄호로 묶습니다. 0x·0b·0o 접두사와 공백·밑줄(_)로 묶은 자릿수는 그대로 넣어도 됩니다.
- 비트판에서 폭(8·16·32·64비트)을 고르면 그 폭의 2의 보수 패턴과 16진수 패턴이 보입니다. 칸을 누르면 그 비트만 뒤집힌 값이 위 칸에 들어갑니다.
- 풀이에서 바꿀 진법을 고르면 나눗셈 사다리와 자리값 계산이 나옵니다. 복사 단추는 묶음 공백을 빼고 값만 복사하며, 링크 복사는 지금 값을 다시 여는 주소를 만듭니다.
진법마다 쓰는 숫자
10보다 큰 진법은 10부터 알파벳을 씁니다. A가 10, F가 15이고 Z가 35라서 36진법까지 적을 수 있습니다. Python의 int()와 JavaScript의 toString()도 2~36진법을 받습니다. 알파벳은 대문자와 소문자를 같은 숫자로 읽습니다.
| 진법 | 쓰는 숫자 | 255 | 코드 접두사 | 자주 보는 곳 |
|---|---|---|---|---|
| 2진법 | 0, 1 | 1111 1111 | 0b | 비트, 플래그, 마스크 |
| 8진법 | 0~7 | 377 | 0o | 파일 권한 |
| 10진법 | 0~9 | 255 | 없음 | 일상의 숫자 |
| 16진법 | 0~9, A~F | FF | 0x | 색 코드, 메모리, 해시 |
| 36진법 | 0~9, A~Z | 73 | 없음 | 짧은 식별 번호 |
n진수를 10진수로: 자리값을 곱해 더하기
오른쪽 끝 자리부터 n⁰, n¹, n², …을 차례로 곱해 모두 더합니다. 16진수 1ED는 1 × 16² + 14 × 16¹ + 13 × 16⁰ = 256 + 224 + 13 = 493입니다. 소수점 아래 자리는 n⁻¹, n⁻², …을 곱하므로, 2진수 0.101은 1/2 + 0/4 + 1/8 = 0.625입니다.
| 자리 | 16² | 16¹ | 16⁰ | 합 |
|---|---|---|---|---|
| 숫자 | 1 | E (14) | D (13) | |
| 자리값 | 256 | 16 | 1 | |
| 숫자 × 자리값 | 256 | 224 | 13 | 493 |
10진수를 n진수로: 정수는 나누고, 소수는 곱하기
정수 부분은 n으로 나눈 나머지를 옆에 적으면서 몫을 다시 n으로 나눕니다. 몫이 n보다 작아지면 멈추고, 마지막 몫부터 나머지를 아래에서 위로 읽습니다. 학교에서 쓰는 나눗셈 사다리가 이 방법이며, 위 풀이 칸이 같은 모양으로 그립니다.
| 나누기 | 몫 | 나머지 |
|---|---|---|
| 13 ÷ 2 | 6 | 1 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 위로 읽기 | 1101 |
소수 부분은 반대로 n을 곱합니다. 곱한 결과의 정수 부분을 떼어 적고, 남은 소수 부분에 다시 n을 곱하기를 소수 부분이 0이 될 때까지 되풀이합니다. 0.625 × 2 = 1.25에서 1, 0.25 × 2 = 0.5에서 0, 0.5 × 2 = 1에서 1을 떼므로, 뗀 숫자를 위에서 아래로 읽은 0.101이 답입니다.
2진수로 끝나지 않는 소수
소수를 기약분수로 고쳤을 때 분모의 소인수가 모두 그 진법의 소인수이면 소수가 끝나고, 다른 소인수가 하나라도 있으면 같은 자리가 끝없이 되풀이됩니다. 2진법의 소인수는 2뿐이라 분모가 2의 거듭제곱인 0.5·0.25·0.125는 끝나지만, 0.1 = 1/10은 분모에 5가 있어 0.0(0011)처럼 0011이 끝없이 되풀이됩니다. 10진법에서 1/3이 0.333…으로 끝나지 않는 것과 같은 이치입니다.
| 10진수 | 분수 | 2진수 | 16진수 |
|---|---|---|---|
0.5 | 1/2 | 0.1 | 0.8 |
0.25 | 1/4 | 0.01 | 0.4 |
0.125 | 1/8 | 0.001 | 0.2 |
0.75 | 3/4 | 0.11 | 0.C |
0.1 | 1/10 | 0.0(0011) | 0.1(9) |
0.2 | 1/5 | 0.(0011) | 0.(3) |
0.3 | 3/10 | 0.0(1001) | 0.4(C) |
0.(3) | 1/3 | 0.(01) | 0.(5) |
컴퓨터의 소수(IEEE 754 배정밀도)는 2진 유효숫자 53비트에서 반올림하므로, 0.1은 정확히 1/10이 아니라 0.1000000000000000055511151231257827021181583404541015625로 저장됩니다. 그래서 0.1을 세 번 더한 값은 0.3과 정확히 같지 않습니다. 이 도구는 값을 분수로 들고 계산하기 때문에 반올림 없이 되풀이 부분까지 보여 줍니다.
2진수와 8·16진수는 묶어서 바로 바꿉니다
16은 2⁴, 8은 2³이므로 2진수를 오른쪽부터 4자리씩 묶으면 16진수 한 자리가 되고, 3자리씩 묶으면 8진수 한 자리가 됩니다. 10진수를 거칠 필요가 없습니다. 예를 들어 1 1110 1101은 앞에 0을 채워 0001 1110 1101로 묶으면 1·E·D, 즉 16진수 1ED이고, 3자리씩 111 101 101로 묶으면 8진수 755입니다.
| 2진수 | 16진수 | 2진수 | 16진수 | 2진수 | 16진수 | 2진수 | 16진수 |
|---|---|---|---|---|---|---|---|
0000 | 0 | 0100 | 4 | 1000 | 8 | 1100 | C |
0001 | 1 | 0101 | 5 | 1001 | 9 | 1101 | D |
0010 | 2 | 0110 | 6 | 1010 | A | 1110 | E |
0011 | 3 | 0111 | 7 | 1011 | B | 1111 | F |
음수와 2의 보수
위의 칸들은 음수를 −5처럼 부호와 크기로 적습니다. 하지만 컴퓨터의 정수 변수는 부호를 따로 두지 않고 2의 보수로 저장합니다. 양수 패턴의 비트를 모두 뒤집고 1을 더하면 같은 크기의 음수 패턴이 됩니다. 8비트에서 5는 0000 0101이고, 비트를 뒤집으면 1111 1010, 여기에 1을 더한 1111 1011(16진수 FB)이 −5입니다. 맨 왼쪽 비트가 1이면 음수로 읽으며, 같은 1111 1011을 부호 없는 수로 읽으면 251이 됩니다.
| 8비트 패턴 | 16진수 | 부호 없이 | 2의 보수로 |
|---|---|---|---|
0111 1111 | 7F | 127 | 127 |
0000 0001 | 01 | 1 | 1 |
0000 0000 | 00 | 0 | 0 |
1111 1111 | FF | 255 | −1 |
1111 1011 | FB | 251 | −5 |
1000 0000 | 80 | 128 | −128 |
| 폭 | 부호 없이 | 2의 보수로 | Java 정수형 |
|---|---|---|---|
| 8비트 | 0 ~ 255 | −128 ~ 127 | byte |
| 16비트 | 0 ~ 65,535 | −32,768 ~ 32,767 | short |
| 32비트 | 0 ~ 4,294,967,295 | −2,147,483,648 ~ 2,147,483,647 | int |
| 64비트 | 0 ~ 18,446,744,073,709,551,615 | −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | long |
값이 고른 폭에 다 들어가지 않으면 위쪽 비트가 잘립니다. 300을 8비트에 넣으면 아래 8비트인 0010 1100만 남아 44가 되는데, 비트판에서 폭을 8로 고르면 이렇게 잘린 모습과 경고가 함께 보입니다.
자주 틀리는 경우
- 진법을 잘못 고른 채 넣기: 1010을 10진수 칸에 넣으면 천십이고, 2진수 칸에 넣어야 10입니다. 수의 모양이 같아도 어느 진법으로 읽느냐에 따라 값이 완전히 달라집니다.
- 접두사를 다른 칸에 넣기: 0x는 16진수를 뜻하므로 10진수 칸에서는 읽을 수 없습니다. 이 도구는 그럴 때 16진수 칸으로 옮기는 단추를 보여 줍니다.
- 알파벳 O와 숫자 0, 소문자 l과 숫자 1: O는 24, L은 21을 뜻하는 숫자라서 25진법·22진법 이상에서만 쓸 수 있습니다. 16진수에는 A~F까지만 있습니다.
- 쉼표를 소수점으로 쓰기: 이 도구와 프로그래밍 언어는 소수점을 마침표로 적습니다. 쉼표는 10진수 칸에서 1,024처럼 세 자리 묶음으로 쓸 때만 읽습니다.
- 앞에 붙은 0: 0755와 755는 같은 수입니다. 다만 C 언어 코드에서는 0으로 시작하는 정수를 8진수로 읽으므로, 10진수를 적을 때는 앞에 0을 붙이지 않습니다.
- 폭을 정하지 않고 2의 보수 읽기: FB는 8비트 2의 보수로 −5이지만, 16비트 00FB로 보면 251입니다. 몇 비트 값인지 먼저 정해야 음수인지 알 수 있습니다.
한계
- 숫자는 1,000자리까지 넣을 수 있습니다. JavaScript의 보통 숫자는 2⁵³ − 1(9,007,199,254,740,991)을 넘으면 정확도를 잃지만, 이 도구는 BigInt 분수로 계산해 그 범위를 넘어도 끝자리까지 맞습니다.
- 소수 부분은 256자리 안에서 끝나거나 되풀이가 시작되지 않으면 그 뒤를 …로 줄여 보여 줍니다. 계산은 분수로 하므로 다른 칸의 값에는 오차가 쌓이지 않지만, …로 줄인 칸을 직접 고치면 줄인 자리까지만 읽습니다.
- 비트판은 정수만, 128비트까지 그립니다. 그보다 큰 수는 2진수 칸에서 전체를 확인합니다.
- 부동소수점(IEEE 754)의 비트 배치, 고정 소수점, 음의 진법, 진법끼리의 덧셈·뺄셈 같은 연산은 다루지 않습니다.
- 모든 계산은 이 브라우저 안에서만 하며, 넣은 값을 서버로 보내지 않습니다.
기준: 진법과 접두사 규칙은 Python 설명서와 ECMAScript 명세, 2의 보수 범위는 Java 언어 명세, 권한·색·네트워크 예시는 POSIX·CSS·RFC 문서를 2026년 10월 22일에 확인했습니다. 표의 값은 이 도구의 계산 코어로 다시 계산해 대조했습니다.
출처
- 01Python: int()허용 진법 2~36, 10~35는 a~z, 0b·0o·0x 접두사와 숫자 사이 밑줄
- 02ECMA-262: Number.prototype.toString진법(radix)은 2~36의 정수
- 03MDN: Number.prototype.toString()진법이 2보다 작거나 36보다 크면 RangeError
- 04MDN: BigInt보통 숫자로 나타낼 수 없는 큰 정수
- 05MDN: Number.MAX_SAFE_INTEGER정확히 다룰 수 있는 가장 큰 정수 2⁵³ − 1
- 06Python 자습서: Floating-Point Arithmetic1/10은 2진수로 끝없이 되풀이되며 53비트로 근사해 저장
- 07Java 언어 명세 4.2.1: Integral Types and Values8·16·32·64비트 2의 보수 정수와 범위
- 08POSIX: chmod8진수 권한 비트 표(0400 읽기·0200 쓰기·0100 실행)
- 09CSS Color Module Level 4: hex notation#rrggbb 두 자리씩 빨강·초록·파랑, ff는 255
- 10RFC 4632 3.1: Basic Concept and Prefix Notation/24는 앞 24비트가 1, 뒤 8비트가 0
- 11cppreference: Integer constant (C)0으로 시작하는 정수 상수는 8진수
자주 묻는 질문
10진수를 2진수로 어떻게 바꾸나요?
2로 나눈 나머지를 옆에 적으면서 몫을 다시 2로 나누고, 몫이 1이 되면 멈춥니다. 마지막 몫 1부터 나머지를 아래에서 위로 읽으면 2진수입니다. 13은 6 나머지 1, 3 나머지 0, 1 나머지 1이 나와 1101입니다.
2진수를 10진수로 바꾸는 방법은 무엇인가요?
오른쪽 끝 자리부터 1, 2, 4, 8, 16처럼 2의 거듭제곱을 곱해 더합니다. 1010은 8 + 0 + 2 + 0이라 10이고, 1111 1111은 128부터 1까지 모두 더해 255입니다.
16진수 FF는 10진수로 얼마인가요?
255입니다. F는 15를 뜻하므로 15 × 16 + 15 = 255가 되고, 2진수로는 1111 1111, 8진수로는 377입니다. 1바이트가 담을 수 있는 가장 큰 값이라 색 코드에서 가장 밝은 단계로 쓰입니다.
음수는 2진수로 어떻게 적나요?
사람이 적을 때는 −101처럼 앞에 −를 붙이지만, 컴퓨터는 2의 보수로 저장합니다. 양수 패턴의 비트를 모두 뒤집고 1을 더하므로, 8비트에서 −5는 0000 0101을 뒤집은 1111 1010에 1을 더한 1111 1011(16진수 FB)입니다. 비트판에서 폭을 골라 확인할 수 있습니다.
0.1을 2진수로 바꾸면 왜 끝나지 않나요?
0.1은 1/10이고 분모 10에 5가 들어 있는데, 2진법은 소인수가 2뿐이라 5로 나누어떨어지게 적을 수 없기 때문입니다. 그래서 0.0(0011)처럼 0011이 끝없이 되풀이되고, 컴퓨터는 53비트에서 반올림해 저장하므로 0.1 + 0.2가 0.3과 정확히 같지 않습니다.
2진수를 16진수나 8진수로 빨리 바꾸는 방법이 있나요?
있습니다. 2진수를 오른쪽부터 4자리씩 묶으면 16진수 한 자리, 3자리씩 묶으면 8진수 한 자리가 됩니다. 1 1110 1101은 4자리씩 0001 1110 1101로 묶어 1ED, 3자리씩 111 101 101로 묶어 755입니다.
0x, 0b, 0o는 무엇인가요?
코드에서 수의 진법을 알려 주는 접두사입니다. 0x는 16진수, 0b는 2진수, 0o는 8진수를 뜻하며 Python과 JavaScript가 이 표기를 씁니다. 이 도구는 접두사를 붙여 넣어도 읽고, 보기에서 접두사를 켜면 붙인 채 복사합니다.
몇 진법까지, 몇 자리까지 바꿀 수 있나요?
2진법부터 36진법까지 바꿀 수 있습니다. 10부터 35는 A부터 Z로 적고 대소문자는 같은 숫자로 읽습니다. 숫자는 1,000자리까지 넣을 수 있으며, 큰 수도 BigInt 분수로 계산해 끝자리까지 정확합니다.