이번 문서의 목표: 이 문서를 다 읽으면 2진법·8진법·16진법 사이를 어떤 조합이든 손으로 변환하고, 이진수 덧셈과 뺄셈을 자리 올림·자리 빌림까지 정확히 계산할 수 있다.
왜 컴퓨터는 2진법을 쓰는가
컴퓨터 내부는 전기 회로다. 전기 신호는 전압이 높은 상태와 낮은 상태, 두 가지를 구분하는 것이 가장 안정적이고 오류가 적다. 전압을 0볼트, 1.5볼트, 3볼트, 4.5볼트처럼 여러 단계로 나눠 10가지 상태(10진법)를 표현하려 하면, 잡음이나 부품 오차 때문에 “이게 3단계인지 4단계인지” 헷갈리는 순간이 생긴다. 반면 “전압이 낮다(0)“와 “전압이 높다(1)” 두 상태만 구분하면 훨씬 여유 있게 구별할 수 있다. 이 물리적인 이유 때문에 컴퓨터는 2진법(binary, 이진법)을 기본 표현 방식으로 쓴다.
쉽게 말하면: 컴퓨터가 2진법을 쓰는 이유는 “0 아니면 1”이라는 두 상태가 전기적으로 가장 확실하게 구별되기 때문이다.
문제는 사람이 2진수를 그대로 읽고 쓰기엔 너무 길고 눈에 잘 안 들어온다는 점이다. 예를 들어 10진수 202를 2진수로 쓰면 11001010처럼 8자리나 된다. 그래서 사람은 2진수를 다루는 중간 표기법으로 8진법(octal)과 16진법(hexadecimal, 흔히 hex라고 줄여 부른다)을 함께 쓴다. 이 문서에서는 이 네 가지 진법(2·8·10·16) 사이를 자유롭게 오가는 방법을 익힌다. 이 내용은 앞으로 나올 모든 편의 기초가 되므로, 여기서 계산 과정을 눈으로만 보지 말고 직접 손으로 따라 계산해 보는 것이 중요하다.
진법이란 무엇인가 — 자리값의 원리
진법(number system, 수 체계)이란 숫자를 표현할 때 몇 개의 서로 다른 기호를 쓰고, 자리가 하나씩 올라갈 때마다 값이 몇 배씩 커지는지를 정한 규칙이다. 이 “몇 배씩”에 해당하는 숫자를 기수(base, 밑)라고 부른다.
우리가 평소 쓰는 10진법(decimal)은 기수가 10이다. 0부터 9까지 열 개의 숫자만 쓰고, 한 자리를 다 쓰면 왼쪽으로 자리를 올린다. 10진수 305를 예로 들면, 각 자리는 오른쪽부터 (1의 자리), (10의 자리), (100의 자리)의 자리값(place value)을 가진다.
- : 백의 자리 숫자 3에 100(10의 2제곱)을 곱한 값
- : 십의 자리 숫자 0에 10(10의 1제곱)을 곱한 값
- : 일의 자리 숫자 5에 1(10의 0제곱, 어떤 수든 0제곱은 1)을 곱한 값
이 원리는 기수가 무엇이든 똑같이 적용된다. 기수가 인 진법에서 오른쪽에서 번째 자리(0부터 세기 시작)의 자리값은 이다. 이 하나의 규칙만 이해하면 2진법·8진법·16진법 모두 같은 방식으로 풀 수 있다.
쉽게 말하면: 어떤 진법이든 “오른쪽 끝 자리부터 기수의 0제곱, 1제곱, 2제곱…을 곱해서 다 더한다”는 계산 방법은 동일하다. 기수만 다를 뿐이다.
2진법의 자리값과 변환
2진법은 기수가 2다. 사용하는 숫자는 0과 1 두 개뿐이며, 이 한 자리를 비트(bit, binary digit의 줄임말)라고 부른다. 8개의 비트를 묶은 단위는 바이트(byte)라고 한다.
2진수 → 10진수
2진수 1011을 10진수로 바꿔 보자. 오른쪽부터 의 자리값을 곱해서 더한다.
이제 이 네 값을 모두 더한다.
따라서 1011(2진수)은 10진수로 11이다. 아래첨자 2는 “이 숫자가 2진법으로 쓰였다”는 표시이고, 결과에 붙는 아래첨자 10은 10진법 표시다. 표기가 없을 때는 문맥상 10진법으로 본다.
하나 더 해 보자. 2진수 110101을 10진수로 바꾼다. 자리는 오른쪽부터 부터 까지다.
| 자리(왼쪽부터) | 비트 | 자리값 | 곱 |
|---|---|---|---|
| 6번째 | 1 | 32 | 32 |
| 5번째 | 1 | 16 | 16 |
| 4번째 | 0 | 8 | 0 |
| 3번째 | 1 | 4 | 4 |
| 2번째 | 0 | 2 | 0 |
| 1번째 | 1 | 1 | 1 |
이므로 110101은 10진수 53이다.
10진수 → 2진수 (2로 나누기 방법)
반대 방향은 2로 계속 나누면서 나머지를 아래에서 위로 읽는 방법(division-remainder method, 나눗셈-나머지 법)을 쓴다. 10진수 45를 2진수로 바꿔 보자.
몫이 0이 되면 멈춘다. 이제 나머지를 아래에서 위로(마지막에 구한 나머지부터 첫 번째 나머지 순서로) 읽으면 101101이 된다. 검산해 보면 로 맞다.
자주 틀리는 점: 나머지를 위에서 아래로(구한 순서대로) 읽으면 순서가 거꾸로 된 잘못된 답이 나온다. 반드시 마지막 나머지가 최상위 비트(맨 왼쪽 자리)가 된다는 점을 기억해야 한다.
8진법과 16진법 — 2진법을 짧게 쓰는 도구
8진법은 기수가 8이라 0부터 7까지의 숫자를 쓰고, 16진법은 기수가 16이라 0부터 9, 그리고 10부터 15를 대신할 A, B, C, D, E, F 여섯 개의 문자를 함께 쓴다. 16진법에서 A는 10, B는 11, C는 12, D는 13, E는 14, F는 15를 의미한다.
| 10진수 | 2진수(4비트) | 16진수 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
8진법과 16진법이 특별한 이유는 8이 이고 16이 이기 때문이다. 즉 8진수 한 자리는 정확히 2진수 3자리와, 16진수 한 자리는 정확히 2진수 4자리와 대응한다. 이 성질 덕분에 2진수와 8진수·16진수 사이의 변환은 자리값 계산 없이 비트를 묶고 나누기만 하면 끝난다.
쉽게 말하면: 16진수 한 글자는 2진수 4자리를 압축해 놓은 것이고, 8진수 한 글자는 2진수 3자리를 압축해 놓은 것이다. 그래서 2진수가 너무 길 때 사람이 읽기 좋게 줄여 쓰는 용도로 8진법·16진법을 쓴다.
2진수 → 16진수
2진수 11010111을 16진수로 바꿔 보자. 오른쪽부터 4비트씩 묶는다.
각 묶음을 따로 10진수로 환산한 뒤 16진수 기호로 바꾼다. 1101은 이므로 16진수로 D, 0111은 이므로 16진수로 7이다. 따라서 11010111은 16진수로 D7이다.
자릿수가 4의 배수가 아니면 왼쪽에 0을 채워서(맨 앞자리, 즉 최상위 비트 쪽에 0을 추가해서) 4자리씩 묶이게 만든다. 예를 들어 1011001(7자리)은 왼쪽에 0을 하나 채워 01011001로 만든 뒤 0101 1001로 묶는다. 0101은 5, 1001은 9이므로 결과는 16진수 59다.
2진수 → 8진수
같은 원리로 3비트씩 묶는다. 2진수 101110을 8진수로 바꾸면 오른쪽부터 3비트씩 나눠 101 110이 된다. 101은 , 110은 이므로 결과는 8진수 56이다.
16진수·8진수 → 2진수
반대 방향은 각 자리를 해당 비트 수의 2진수로 그대로 펼치기만 하면 된다. 16진수 2F를 2진수로 바꿔 보자. 2는 4비트로 0010, F는 4비트로 1111이므로 이어 붙이면 00101111이 된다(맨 앞의 불필요한 0은 생략할 수 있어 101111로도 쓴다).
진법 변환 종합 예제 — 2·8·10·16을 한 번에
10진수 154를 2진수, 8진수, 16진수로 모두 바꿔 보면서 전 과정을 확인한다.
10 → 2: 나머지 , 나머지 , 나머지 , 나머지 , 나머지 , 나머지 , 나머지 , 나머지 . 나머지를 아래에서 위로 읽으면 10011010.
2 → 8: 10011010을 오른쪽부터 3비트씩 묶는다. 8자리는 3의 배수가 아니므로 왼쪽에 0을 채워 010 011 010으로 만든다. 010은 2, 011은 3, 010은 2이므로 8진수는 232.
2 → 16: 10011010을 오른쪽부터 4비트씩 묶으면 1001 1010. 1001은 9, 1010은 10(=A)이므로 16진수는 9A.
검산(16 → 10): . 원래 값과 일치하므로 변환이 정확했다.
이렇게 2진법을 중심에 두고 다른 진법과 오가는 습관을 들이면 실수를 줄일 수 있다. 8진법이나 16진법에서 곧바로 10진법으로 가고 싶을 때도, 자리값 계산이 익숙하지 않다면 일단 2진법으로 펼친 뒤 계산해도 무방하다.
이진수 덧셈
이진수 덧셈의 규칙은 단 네 가지뿐이다.
마지막 규칙에서 나오는 “윗자리로 넘기는 1”을 자리올림(carry, 캐리)이라고 한다. 10진법에서 일 때 5를 쓰고 1을 윗자리로 올리는 것과 원리가 완전히 같다.
1011과 0110을 더해 보자. 오른쪽 자리부터 계산한다.
한 자리씩 손으로 풀면 다음과 같다.
- 1번째 자리(오른쪽 끝): , 자리올림 없음
- 2번째 자리: , 이 자리에 0을 쓰고 자리올림 1 발생
- 3번째 자리: , 이 자리에 0을 쓰고 자리올림 1 발생
- 4번째 자리: , 이 자리에 0을 쓰고 자리올림 1 발생
- 마지막으로 남은 자리올림 1을 맨 앞에 붙인다
결과는 10001이다. 검산: 1011은 10진수 11, 0110은 10진수 6이므로 이고, 10001은 로 일치한다.
이진수 뺄셈
뺄셈의 기본 규칙도 네 가지다.
윗자리에서 값을 끌어오는 것을 자리빌림(borrow, 보로우)이라고 한다. 10진법에서 을 계산할 때 일의 자리 이 안 되니 십의 자리에서 10을 빌려와 로 계산하는 것과 같은 원리다.
1100에서 0101을 빼 보자.
- 1번째 자리(오른쪽 끝): 은 안 되므로 윗자리에서 빌려온다. 을 쓰고, 빌려온 만큼 다음 자리에서 1을 갚아야 한다.
- 2번째 자리: 원래 값은 0인데 앞에서 1을 빌려줬으므로 이 되어 다시 이 안 되는 상황이 된다. 윗자리에서 또 빌려온다. 을 쓰고, 또 다음 자리에 빚이 넘어간다.
- 3번째 자리: 원래 값 1에서 빚 1을 먼저 갚으면 0이 되고, 여기서 빼는 값 1을 빼야 하므로 다시 이 되어 윗자리에서 빌려온다. .
- 4번째 자리: 원래 값 1에서 빚 1을 갚으면 0이 되고, 빼는 값은 0이므로 결과는 0.
결과는 0111이다. 검산: 1100은 12, 0101은 5이므로 이고, 0111은 7이다. 일치한다.
실제 컴퓨터 내부에서는 뺄셈을 이렇게 자리빌림으로 직접 처리하지 않고, 보수(complement)라는 방법으로 덧셈 회로 하나로 덧셈과 뺄셈을 모두 처리한다. 이 보수 연산과 오버플로(overflow, 표현 범위를 벗어나는 현상) 판단은 다루는 내용이 많으므로 07편(자료의 표현: 정수·보수·오버플로)에서 본격적으로 다룬다. 지금은 “이진수도 자리올림·자리빌림 규칙만 다를 뿐 10진수 계산과 똑같은 방식으로 계산된다”는 감각만 잡아두면 충분하다.
자주 틀리는 점
- 자리값의 지수를 1부터 세는 실수: 오른쪽 끝 자리는 이 아니라 부터 시작한다. 이라는 점을 놓치면 전체 계산이 한 자리씩 밀린다.
- 나눗셈-나머지 법에서 나머지를 순서대로 읽는 실수: 나머지는 반드시 거꾸로(마지막에 나온 나머지가 최상위 비트) 읽어야 한다.
- 8진수·16진수 변환 시 묶는 비트 수를 착각하는 실수: 8진법은 3비트, 16진법은 4비트씩 묶어야 한다. 이 숫자는 각각 , 에서 나온다는 원리를 기억하면 헷갈리지 않는다.
- 이진수 덧셈에서 자리올림을 빠뜨리는 실수: 은 반드시 자리올림 1을 발생시킨다. 여러 자리를 연속으로 더할 때 자리올림이 다음 자리, 그다음 자리까지 연쇄적으로 이어질 수 있음을 놓치기 쉽다.
- 뺄셈에서 자리빌림을 갚는 순서를 헷갈리는 실수: 어떤 자리가 이미 다른 자리에 1을 빌려준 상태라면, 그 자리의 값에서 먼저 빚(1)을 갚은 다음 원래 빼야 할 값을 뺀다.
핵심 정리
- 진법은 “기수의 거듭제곱을 자리값으로 쓴다”는 하나의 원리로 통일된다. 2진법·8진법·10진법·16진법 모두 이 원리를 공유한다.
- 2진수→10진수는 자리값을 곱해서 더하고, 10진수→2진수는 2로 나눈 나머지를 거꾸로 읽는다.
- 8진법은 2진수 3비트, 16진법은 2진수 4비트와 정확히 대응하므로 비트를 묶거나 펼치기만 하면 변환된다.
- 이진수 덧셈은 자리올림, 뺄셈은 자리빌림 규칙을 10진수 계산과 같은 방식으로 적용한다.
- 컴퓨터 내부의 실제 뺄셈 처리 방식(보수)과 오버플로 판단은 07편에서 깊게 다룬다.
마무리 복습
참고 자료
- MDN Web Docs — 진법과 이진수 표현의 기초 개념을 확인할 수 있는 공신력 있는 문서.
- 국가평생교육진흥원 독학학위제 — 독학사 시험 안내 및 평가영역 공식 자료.