진법 변환과 2진수·8진수·16진수 사칙연산 수학 가이드

컴퓨터 공학을 공부하거나 시스템 프로그래밍, 임베디드, 웹 개발을 하다 보면 2진수(0101), 리눅스 권한의 8진수(755), 일상의 10진수, 그리고 메모리 주소와 색상 코드의 **16진수(0x7FFF, #FF5733)**를 매일 다루게 됩니다.
서로 다른 진법으로 표기된 두 숫자를 더하거나(예: 2진수 1010 + 16진수 0x1F), 10진수 숫자를 2진수·8진수·16진수로 자유자재로 변환하는 것은 컴퓨터 아키텍처와 비트 연산의 가장 기본적인 뼈대입니다.
자릿수 거듭제곱과 나머지 분할법을 이용한 진법 상호 변환의 수학적 공식, 2의 보수(2's Complement) 음수 표현법, 그리고 이종 진법 간 사칙연산의 단계별 풀이 과정을 완벽히 정리해 드립니다.
핵심 요약 ① 4대 핵심 진법: 2진법(컴퓨터 트랜지스터 0/1), 8진법(3비트 묶음, 파일 권한), 10진법(인간의 표준), 16진법(4비트 니블 묶음, 메모리 주소). ② 10진수로 변환: 각 자리 숫자에 밑수(Radix)의 거듭제곱을 곱하여 누적 합산합니다 ($N = sum d_i imes B^i$). ③ 타 진수로 변환: 10진수를 목표 밑수로 몫이 0이 될 때까지 반복해서 나눈 뒤 발생한 나머지들을 역순으로 조립합니다. ④ 본 진법 연산기는 서로 다른 진법의 사칙연산(+, -, *, /)을 즉시 계산하고 상세한 수학적 풀이 단계를 한눈에 보여줍니다.
컴퓨터 과학의 핵심 4대 진법 체계
진법(Radix / Base)은 사용할 수 있는 서로 다른 기호(숫자)의 개수를 의미합니다:
1. 2진법 (Binary, Base 2)
- 사용 기호: 0, 1
- 특징: 반도체 트랜지스터의 ON(1)/OFF(0) 전압 상태를 직접 나타내는 기계어의 원초적 형태입니다.
2. 8진법 (Octal, Base 8)
- 사용 기호: 0 ~ 7
- 특징: 2진수 3비트($2^3=8$)를 정확히 1글자로 압축합니다. 리눅스 파일 권한(chmod 755: r=4, w=2, x=1)에 널리 쓰입니다.
3. 10진법 (Decimal, Base 10)
- 사용 기호: 0 ~ 9
- 특징: 인간의 열 손가락 셈법에서 유래한 일상생활의 표준 수 체계입니다.
4. 16진법 (Hexadecimal, Base 16)
- 사용 기호: 0 ~ 9 및 A(10), B(11), C(12), D(13), E(14), F(15)
- 특징: 2진수 4비트(1바이트의 절반인 1니블, $2^4=16$)를 1문자로 간결하게 표현합니다. 메모리 주소(0x7FFEE4), 웹 컬러 코드(#FFFFFF)의 표준입니다.
진법 상호 변환의 수학적 알고리즘
1. 임의의 진법 ➔ 10진수 변환 (거듭제곱 다항식 합산)
$$N_{10} = d_{n-1} B^{n-1} + dots + d_2 B^2 + d_1 B^1 + d_0 B^0$$
- 예시 (16진수 0x2F ➔ 10진수): $$(2 imes 16^1) + (15 imes 16^0) = 32 + 15 = mathbf{47}$$
2. 10진수 ➔ 임의의 진법 변환 (나눗셈 나머지 역순 나열)
10진수를 목표 밑수 $B$로 나누며 몫이 0이 될 때까지 나머지를 수집합니다:
- 예시 (10진수 47 ➔ 2진수):
- $47 div 2 = 23$ ... 나머지 1 (최하위 비트 LSB)
- $23 div 2 = 11$ ... 나머지 1
- $11 div 2 = 5$ ... 나머지 1
- $5 div 2 = 2$ ... 나머지 1
- $2 div 2 = 1$ ... 나머지 0
- $1 div 2 = 0$ ... 나머지 1 (최상위 비트 MSB)
- 나머지를 역순으로 조립하면 101111 (Base 2) 도출.
무료 · 진법 선택 및 수치 입력만으로 1초 만에 사칙연산 및 단계별 풀이 과정 출력

📖 프로그래밍 및 서버 운영에서 겪는 진법 계산 참사 사연
사연 1: 8진수 권한(chmod 777) 오적용으로 사내 DB를 해킹당한 시스템 엔지니어
서버 관리자 A씨는 권한 오류가 나자 무심코 chmod 777 명령을 내렸습니다. 8진수 777이 2진수 111 111 111(소유자, 그룹, 기타 사용자 모두에게 읽기·쓰기·실행 권한 부여)을 의미한다는 사실을 간과한 것입니다. 익명 공격자가 백도어 스크립트를 업로드해 DB가 탈취당하는 사고를 겪은 뒤, 8진수 권한 비트 마스크(755: rwxr-xr-x)의 엄격한 보안 통제를 도입했습니다.
사연 2: C언어에서 0으로 시작하는 숫자 썼다가 8진수로 파싱된 버그
임베디드 개발자 B씨는 센서 초기화 코드를 작성하며 int delay = 012;라고 선언했습니다. 10진수 12ms 딜레이를 의도했으나, 프로그래밍 언어에서 0으로 시작하는 정수 리터럴은 8진수로 해석되어 실제 10ms로 작동했습니다. 타이밍 동기화가 어긋나는 난치성 버그로 3일을 밤샘한 뒤 진법 표기 규칙(0x는 16진수, 0b는 2진수, 0은 8진수)을 뼈저리게 각인했습니다.
사연 3: CSS 색상 코드의 16진수 RGB 채널 계산을 손으로 풀다 망친 디자이너
C 웹 퍼블리셔는 #3B82F6 색상에서 투명도 50%를 적용하기 위해 8자리 Hex(#3B82F680)를 계산하려 했습니다. 10진수 128(255의 50%)을 16진수로 암산하다가 오타를 내 엉뚱한 색상이 렌더링되었습니다. 진법 변환기로 정밀하게 16진수 바이트를 검증하여 완벽한 UI를 완성했습니다.
🔬 핵심 기술 메커니즘 — 2진수-8진수-16진수 직접 변환 (비트 그룹핑)
10진수를 거치지 않고 2진수에서 8진수, 16진수로 1초 만에 직통 변환하는 비트 그룹핑 원리를 분석합니다.
1. 2진수 ➔ 16진수 (4비트씩 묶기, 1 Nibble)
- 2진수: 1 1 0 1 0 1 1 0
- 4비트씩 분할: [1101] [0110]
- 16진수 변환: $1101_2 = 13_{10} = mathbf{D}$, $0110_2 = 6_{10} = mathbf{6}$ ➔ 0xD6
2. 2진수 ➔ 8진수 (3비트씩 묶기)
- 2진수: 0 1 1 0 1 0 1 1 0 (앞에 0 채움)
- 3비트씩 분할: [011] [010] [110]
- 8진수 변환: $011_2 = 3$, $010_2 = 2$, $110_2 = 6$ ➔ 326 (Base 8)
📊 4대 진법 0부터 15까지 1:1 대조 매트릭스
| 10진수 (Dec) | 2진수 (Bin, 4-bit) | 8진수 (Oct) | 16진수 (Hex) | 비트 가중치 ($8 cdot 4 cdot 2 cdot 1$) |
|---|---|---|---|---|
| 0 | 0000 | 0 | 0 | $0+0+0+0$ |
| 1 | 0001 | 1 | 1 | $0+0+0+1$ |
| 2 | 0010 | 2 | 2 | $0+0+2+0$ |
| 3 | 0011 | 3 | 3 | $0+0+2+1$ |
| 4 | 0100 | 4 | 4 | $0+4+0+0$ |
| 5 | 0101 | 5 | 5 | $0+4+0+1$ |
| 6 | 0110 | 6 | 6 | $0+4+2+0$ |
| 7 | 0111 | 7 | 7 | $0+4+2+1$ |
| 8 | 1000 | 10 | 8 | $8+0+0+0$ |
| 9 | 1001 | 11 | 9 | $8+0+0+1$ |
| 10 | 1010 | 12 | A | $8+0+2+0$ |
| 11 | 1011 | 13 | B | $8+0+2+1$ |
| 12 | 1100 | 14 | C | $8+4+0+0$ |
| 13 | 1101 | 15 | D | $8+4+0+1$ |
| 14 | 1110 | 16 | E | $8+4+2+0$ |
| 15 | 1111 | 17 | F | $8+4+2+1$ |
⚠️ 진법 연산 시 흔히 하는 5가지 실수
- 프로그래밍 언어에서 앞자리 0을 8진수로 오인: 075를 10진수 75로 착각하는 실수 (0 접두사는 8진수).
- 16진수 알파벳(A~F)의 10진수 값 혼동: A=10, B=11, C=12, D=13, E=14, F=15를 헷갈려 계산 오류 유발.
- 2진수 뺄셈 시 2의 보수 변환 누락: 컴퓨터의 음수 덧셈 원리를 무시하고 자릿수 빌림수를 수기로 계산하다가 부호 비트가 깨지는 것.
- 16진수 4비트 그룹핑 시 우측 정렬 미준수: 11011을 좌측부터 [1101][1]로 묶어버리는 참사 (항상 맨 오른쪽 LSB부터 4개씩 묶어야 함).
- 이종 진법 사칙연산 시 공통 진법 미변환: 2진수와 16진수를 10진수로 통일하지 않고 그대로 더하려는 실수.
💡 무결점 진법 연산 5단계 실전 워크플로우
- 1단계 (입력 숫자 및 진법 지정): 첫 번째 수(예: 2진수 1101)와 두 번째 수(예: 16진수 A)의 진법을 각각 선택합니다.
- 2단계 (사칙연산자 선택): 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 중 원하는 연산을 클릭합니다.
- 3단계 (목표 출력 진법 선택): 최종 결과를 2진수, 8진수, 10진수, 16진수 중 어떤 포맷으로 볼지 지정합니다.
- 4단계 (1초 실시간 연산 및 동시 대조): 메인 카드에 결과가 뜨고, 아래에 4대 진법별 환산값이 일렬로 출력됩니다.
- 5단계 (상세 풀이 과정 검증): '상세 계산 과정' 박스에서 10진수 중간 변환과 몫/나머지 나눗셈 단계를 손풀이처럼 확인합니다.
🔍 소프트웨어 엔지니어가 공개하는 진법 팁 7선
- 비트마스크(Bitmask) 16진수 암기: 0xFF는 8비트 전체가 1(11111111), 0x0F는 하위 4비트(00001111)를 마스킹합니다.
- 2진수 4비트 단위 띄어쓰기: 긴 2진수는 1010 1100 0011처럼 4자리씩 띄어 쓰면 16진수로 즉시 치환(0xAC3)됩니다.
- 자바스크립트 진법 변환 함수:
- 진법 파싱: parseInt("1010", 2) ➔ 10
- 진법 문자열화: (255).toString(16) ➔ "ff"
- 2의 거듭제곱 수열 암기: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 (2진수 1이 켜진 자리의 가중치).
- 비트 시프트(<<, >>)의 산술적 의미: 왼쪽 시프트(x << 1)는 2배 곱셈, 오른쪽 시프트(x >> 1)는 2로 나눈 몫.
- 유닉스 권한 rwx 3비트 덧셈: $r(4) + w(2) + x(1) = 7$ (읽기/쓰기/실행 전체 허용).
- 본 계산기 북마크 등록: 코딩 테스트 준비나 CS 전공 과제, 시스템 엔지니어링 작업 시 필수 도구로 활용하세요.
🎯 최종 결정 트리: 어떤 진법을 사용해야 할까?
- 경우 A (디지털 논리 회로 설계, 비트 플래그 연산) ➔ 2진수 (Binary)
- 경우 B (리눅스 파일 퍼미션 설정, 구형 메인프레임) ➔ 8진수 (Octal)
- 경우 C (일상생활 수치 계산, 재무/회계 데이터) ➔ 10진수 (Decimal)
- 경우 D (메모리 주소 포인터, 색상 코드, 바이너리 덤프) ➔ 16진수 (Hexadecimal)
📑 진법 변환 & 디지털 논리 핵심 용어 치트시트
- Radix (밑수 / 기수): 진법 체계에서 기본이 되는 숫자의 개수 (2, 8, 10, 16 등).
- Nibble (니블): 4개의 비트(Bit)로 이루어진 데이터 단위 (16진수 1글자).
- LSB / MSB: 최하위 비트(Least Significant Bit)와 최상위 비트(Most Significant Bit).
- 2의 보수 (Two's Complement): 모든 비트를 반전시킨(1의 보수) 뒤 1을 더해 음수를 표현하는 컴퓨터 표준 방식.
자주 묻는 질문
왜 16진수에는 10부터 15까지 영문자 A, B, C, D, E, F를 쓰나요?
10진수 '10'은 두 자리 숫자이기 때문에, 한 자리 안에 10을 표현하기 위해 알파벳 A를 10, B를 11, C를 12, D를 13, E를 14, F를 15로 약속하여 단 1글자로 표기하기 위함입니다.
서로 다른 진법의 숫자를 더할 때 가장 쉬운 방법은 무엇인가요?
두 숫자를 먼저 익숙한 10진수로 변환하여 덧셈을 수행한 다음, 그 결과 10진수를 목표 진법으로 나눗셈(나머지 역순) 변환하는 것이 오차 없이 가장 정확합니다. 본 계산기가 이 과정을 자동으로 처리해 줍니다.
계산기에 입력한 수식이 서버에 저장되나요?
전혀 저장되지 않습니다. 모든 진법 상호 변환 및 사칙연산 풀이는 사용자의 웹 브라우저 내부 자바스크립트 엔진에서 100% 로컬로 즉시 연산됩니다.
