진법 변환 원리
각 진법은 숫자를 해당 기수의 거듭제곱 합으로 표현합니다(2진은 2, 8진은 8, 16진은 16). 10진수를 변환할 때는 목표 기수로 반복해서 나눈 나머지를 역순으로 읽습니다. 이 페이지의 주제는 자릿값, 즉 위치 기수법(positional notation)이라는 발상 그 자체입니다 — 같은 숫자 기호라도 어느 자리에 놓이느냐에 따라 값이 완전히 달라진다는 원리입니다. 자릿값이 없다면 큰 수를 나타내기 위해 매번 새로운 기호를 만들어야 하지만, 자릿값이 있으면 0부터 9(또는 0부터 F)까지의 기호 몇 개만으로 원하는 만큼 큰 수를 표현할 수 있습니다.
- base — 2(2진), 8(8진), 16(16진)
- dᵢ — i번째 자리 숫자 (16진의 A~F는 10~15를 뜻함)
자세한 설명
자릿값이라는 발명 — 위치 기수법이 왜 대단한가
근거: n진법에서 각 자리는 밑수의 거듭제곱을 뜻합니다. 오른쪽에서부터 0번째 자리는 base⁰, 그다음은 base¹, base² 순으로 커집니다. 예를 들어 2진수 1011은 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1 = 11입니다. 자리마다 새로운 기호를 발명해야 하는 표기 방식과 달리, 위치 기수법은 정해진 개수의 숫자 기호만으로 원하는 만큼 큰 수를 표현할 수 있게 해줍니다 — 같은 기호 1이라도 놓인 자리에 따라 1도 되고 2도 되고 8도 됩니다. 10진수 173도 마찬가지입니다: 1×10² + 7×10¹ + 3×10⁰ = 100+70+3 = 173으로, 우리가 매일 쓰는 10진법 역시 이 원리 위에 서 있습니다. 이것이 자릿값의 핵심이며, 10진법이든 2진법이든 16진법이든 원리는 똑같이 적용됩니다.
계산 과정: 173을 2진수·8진수·16진수로
10진수 173을 2진수로 바꾸는 계산 과정은 나머지 나눗셈을 반복하는 것입니다. 173÷2=86…1, 86÷2=43…0, 43÷2=21…1, 21÷2=10…1, 10÷2=5…0, 5÷2=2…1, 2÷2=1…0, 1÷2=0…1. 몫이 0이 될 때까지 나눈 뒤 나머지를 마지막에서 첫 번째 순서로 거꾸로 읽으면 10101101이 됩니다. 같은 방식으로 8로 나누면 173÷8=21…5, 21÷8=2…5, 2÷8=0…2이므로 거꾸로 읽어 255가 되고, 16으로 나누면 173÷16=10…13, 10÷16=0…10이므로 거꾸로 읽어 A(10)D(13), 즉 AD가 됩니다. 세 결과 모두 위 계산기에 173을 넣어 그대로 확인할 수 있습니다.
16진수가 프로그래밍에 쓰이는 이유
16은 2⁴이기 때문에 16진수 한 자리가 정확히 2진수 네 자리에 대응합니다. 그래서 자리마다 딱 떨어지게 변환할 수 있습니다. 앞서 구한 2진수 10101101을 오른쪽부터 네 자리씩 끊으면 1010과 1101이 되고, 1010은 10이라 A, 1101은 13이라 D이므로 합쳐서 AD가 됩니다 — 나머지 나눗셈으로 구한 값과 정확히 일치합니다. 8진수도 같은 이유로 쓰입니다: 8은 2³이라 8진수 한 자리가 2진수 세 자리에 대응합니다. 반면 10진수는 2의 거듭제곱이 아니므로(10 = 2×5) 이런 깔끔한 자리 대응이 성립하지 않아, 10진수를 2진수로 바꾸려면 자리마다 끊어 읽는 게 아니라 앞서 본 나머지 나눗셈처럼 값 전체를 다시 계산해야 합니다. 이 자리 대응 덕분에 프로그래머는 길고 읽기 어려운 2진수 대신 16진수나 8진수로 값을 짧고 정확하게 표기하며, 메모리 주소나 색상 코드처럼 2진수 데이터를 다룰 때 특히 자주 쓰입니다.
색상 코드가 16진수인 이유
웹에서 흔히 보는 #RRGGBB 색상 코드는 빨강·초록·파랑 각 채널의 0~255 값을 두 자리 16진수로 적은 것입니다. 한 채널이 가질 수 있는 최댓값 255는 16진수로 FF인데, F가 15이므로 FF = 15×16 + 15 = 255가 되어 정확히 맞아떨어집니다. 두 자리 16진수는 0부터 255까지 256가지 값을 정확히 표현할 수 있어서(16×16=256), 채널 하나를 나타내는 데 이보다 더 딱 맞는 자릿수가 없습니다. 만약 채널값이 5, 200, 16처럼 자릿수가 제각각일 때 10진수로 그냥 이어 적으면(520016) 5·200·16인지 52·0·16인지 경계가 모호해지지만, 항상 두 자리로 고정되는 16진수(05·C8·10)는 여섯 글자만 보고도 RR·GG·BB를 자리 단위로 즉시 나눌 수 있습니다. 이 계산기는 그 자릿수 대응 원리만 보여줄 뿐, 색 공간 자체의 변환은 다루지 않습니다.
소수 부분과 부동소수점 함정
10진수 0.1은 2진수로 옮기면 0.0001100110011…처럼 끝나지 않는 무한소수가 됩니다. 10진수에서 1/3이 0.333…으로 끝나지 않듯, 2진수에서는 밑이 2의 거듭제곱이 아닌 분모를 가진 소수가 끝나지 않습니다. 컴퓨터는 유한한 비트만 저장할 수 있어 이 무한소수를 어느 자리에서 잘라 근사값으로 저장하는데, 그 결과 0.1 + 0.2를 계산하면 정확히 0.3이 아니라 0.30000000000000004가 나옵니다. 이는 특정 언어의 버그가 아니라 2진 부동소수점(IEEE 754) 방식 자체의 잘 알려진 함정입니다. 같은 방식이 정수 쪽에도 한계를 남깁니다 — 자바스크립트 숫자가 오차 없이 표현하는 정수는 2^53−1(9,007,199,254,740,991)까지이며. 다만 이 계산기의 코드를 확인한 결과 입력값을 정수로 자른 뒤(Math.trunc) 변환하므로, 소수점 이하가 있는 값을 입력해도 정수 부분만 계산에 쓰입니다.
60진법의 흔적과 이 페이지의 기준일
시간을 60초·60분 단위로, 각도를 360도로 나누는 관습은 고대 바빌로니아의 60진법 수 체계에서 비롯되었다고 알려져 있습니다. 다만 이 역사적 기원의 세부 경로까지 확정하기는 어려워, 여기서는 이 한 문장 이상 단정하지 않습니다. 60진법이 왜 골랐는지는 여러 설이 있지만, 60이 2·3·4·5·6·10·12·15·20·30으로 나누어떨어지는 약수가 많은 수라 분수 계산이 편했으리라는 점은 이 계산기가 다루는 자릿값·밑수 원리와 같은 결의 이야기입니다. 밑수가 크고 약수가 많을수록 나눗셈이 딱 떨어지는 경우가 늘어나는 것은 어느 진법에서나 성립하는 성질입니다. 이 페이지 설명의 기준일은 2026년입니다 — 진법 변환 자체는 수학적으로 고정되어 바뀌지 않지만, 예시 문구나 프로그래밍 관행에 대한 서술은 이후 갱신될 수 있습니다.
빠른 확인. 255는 바이트 1개가 가질 수 있는 최댓값입니다 — 2진수로는 11111111, 16진수로는 FF이며, 그래서 색상 코드·IP 주소·메모리 용량 표기에 자주 등장합니다. 173처럼 자리마다 값이 뒤섞여 보이는 수도 위에 입력해 보면 나머지 나눗셈 결과와 정확히 같은 2진수·8진수·16진수가 즉시 나옵니다.
자주 묻는 질문
255를 16진수로 변환하면?
255 ÷ 16 = 15 나머지 15입니다. 몫과 나머지가 모두 15이고 16진수로 F이므로 255 = FF가 됩니다. 위에 255를 입력해 확인해 보세요 — 바이트 1개가 가질 수 있는 최댓값입니다.
10진수를 2진수로 손으로 변환하려면?
2로 계속 나누면서 나머지를 아래에서 위로 읽습니다. 10의 경우: 10÷2=5 나머지0, 5÷2=2 나머지1, 2÷2=1 나머지0, 1÷2=0 나머지1 → 나머지를 위로 읽으면 1010입니다. 173처럼 더 큰 수도 몫이 0이 될 때까지 같은 방식을 반복하면 됩니다.
16진수는 왜 알파벳 A~F를 쓰나요?
16진수는 한 자리에 서로 다른 숫자 16개가 필요하지만 10진 숫자는 0~9 10개뿐입니다. A~F가 10~15를 대신해 한 글자로 0~15까지 표현할 수 있게 합니다. 그래서 16진수 두 자리(예: AD)만으로도 10진수 세 자리 값(173)을 표현할 수 있습니다.
1024는 2진수·16진수로 얼마인가요?
1024는 2진수로 10000000000(11자리), 16진수로는 400입니다. 2¹⁰이기 때문에 컴퓨터에서 킬로바이트의 경계값으로 쓰입니다.
이 계산기에 소수점이 있는 값을 입력하면 어떻게 되나요?
정수 부분만 계산에 쓰입니다. 예를 들어 173.9를 입력해도 173으로 취급되어 2진수 10101101, 8진수 255, 16진수 AD가 나옵니다 — 소수 부분은 버려집니다. 이는 이 계산기가 정수 전용으로 설계되었기 때문이지, 진법 변환 자체가 소수를 다룰 수 없어서가 아닙니다.