진법 변환 쉽게 이해하기 — 개념과 원리
진법은 자리마다 몇 개의 숫자를 쓰는지에 따라 수를 나타내는 방법입니다. 우리는 일상에서 10진법을 쓰고, 컴퓨터는 0과 1만 쓰는 2진법으로 동작하며, 프로그래머는 2진수를 짧게 적기 위해 16진법이나 8진법을 자주 씁니다. 이 계산기는 2진법부터 36진법 사이의 정수를 다른 진법으로 바꾸고, 10진수, 2진수, 16진수 표기도 함께 보여 줍니다.
계산 방법
입력 읽기: 0–9는 0–9를, A–Z는 대소문자 구분 없이 10–35를 나타냅니다. 모든 숫자는 입력 진법보다 작아야 합니다. 왼쪽부터 값 = 값 × 진법 + 숫자를 되풀이해 값을 구하며, 이는 오른쪽 끝 자리를 0번째로 하여 각 자리 숫자 × 진법^자리를 모두 더한 것과 같습니다.
출력 쓰기: 값을 바꿀 진법으로 몫이 0이 될 때까지 계속 나누고, 나머지를 거꾸로 읽으면 새 진법의 숫자가 됩니다.
앞에 붙은 음수 부호는 그대로 유지되며, 큰 정수 연산을 써서 긴 수도 정확하게 바꿉니다.
원리
자리값 기수법에서는 한 자리 왼쪽으로 갈 때마다 자리값이 진법의 수만큼 곱해집니다. 10진법의 자리값은 1, 10, 100…, 2진법은 1, 2, 4, 8…, 16진법은 1, 16, 256…입니다. 같은 양을 어느 진법으로든 쓸 수 있고, 달라지는 것은 자리값뿐입니다. 진법으로 나눈 나머지는 맨 오른쪽 자리의 숫자이므로, 나눗셈을 되풀이하면 오른쪽 자리부터 숫자가 하나씩 나옵니다. 16 = 2⁴, 8 = 2³이므로 16진수 한 자리는 정확히 2진수 네 자리, 8진수 한 자리는 세 자리에 대응합니다.
예제 풀이
- 입력값: 수 FF, 입력 진법 16, 출력 진법 2입니다.
- F = 15이므로 FF = 15 × 16 + 15 = 255이고, 10진수는 255입니다.
- 255를 2로 계속 나누면 127 … 1, 63 … 1, 31 … 1, 15 … 1, 7 … 1, 3 … 1, 1 … 1, 0 … 1입니다.
- 나머지를 거꾸로 읽으면 11111111입니다.
- 간단히 F는 2진수로 1111이므로 FF = 1111 1111이며, 16진수는 FF입니다.
결과 해석
2진수 n자리로는 2ⁿ − 1까지 나타낼 수 있으므로 255는 1바이트(8비트)의 최댓값입니다. 16진수 두 자리는 항상 1바이트에 해당하므로 색상 코드(#FF8800)나 메모리 주소를 16진수로 씁니다. "invalid digits for this base"가 나오면 8진수에 8을 넣거나 16진수에 G를 넣은 것처럼 진법보다 큰 숫자가 있다는 뜻입니다.
흔한 실수
- 나머지를 아래에서 위로 읽지 않고 위에서 아래로 읽습니다.
- 36진법에서 영문자 O와 숫자 0, 영문자 l과 숫자 1을 혼동합니다.
- 0.1 같은 소수 부분도 변환된다고 생각합니다. 이 도구는 정수만 변환합니다.
- 0x, 0b 같은 접두어까지 입력합니다. 숫자만 넣어야 합니다.
자주 묻는 질문
왜 36진법까지만 있나요?
숫자 10개와 로마자 26개를 합치면 36개이므로, 새 기호를 만들지 않고 쓸 수 있는 최대가 36진법입니다.
2진수를 16진수로 빨리 바꾸는 방법이 있나요?
오른쪽부터 네 자리씩 묶어 각 묶음을 16진수 한 자리로 바꿉니다. 1010 1111은 AF입니다.
8진법은 요즘 어디에 쓰이나요?
755 같은 유닉스 파일 권한 표기에 쓰이며, 8진수 한 자리가 권한 비트 세 개를 나타냅니다.
출처: D. E. Knuth, The Art of Computer Programming, Vol. 2: Seminumerical Algorithms, 4.1절(위치 기수법), 4.4절(진법 변환)