일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 증명
- language
- C언어
- primitive notion
- 문법
- C
- coding
- 코딩
- 공리
- Developer
- It
- 컴공
- structure
- Binary
- c++
- 구조체
- Syntax
- 개발자
- 이진수
- Proposition
- 정리
- Mathmetics
- 프로그래밍
- Engineer
- proof
- Axiom
- Programming
- computer
- University
- Engineering
- Today
- Total
Study Note
디지털 시스템과 이진수 체계 본문

현재 과학 기술은 디지털 시스템을 기반으로 많은 발전을 이루고 있습니다. 일상에서 사용하는 컴퓨터, TV, 핸드폰 등의 기기들이 모두 이에 해당되지요. 이런 장치들은 대부분 내재된 프로그램에 따라 작용하는 명령들을 수행합니다. 여기서 디지털이란 상태를 비연속적으로 표현하는 것으로 아날로그와 대비되는 말입니다. 그럼 어떤 수단으로 이산적인 표현을 할까요?
이진수(Binary)
바로 2진수(binary)를 이용하는 것입니다. 2진수가 무엇인지 살펴보기 전에 우리가 일상에서 사용하는 자연수를 예시를 통해 간단하게 분석해보겠습니다.

3172라는 자연수를 10의 거듭제곱으로 표현된 각 항에 계수를 곱하고 이를 모두 더하는 방식으로 표현 했는데요, 너무 당연하게 느껴지는 식이지만 진법에서 가장 기본이 되는 식입니다. 자연수는 10진수 체계를 이용하기에 표현되는 방식으로 계수를 일반화 시켜보면 다음과 같습니다.

이렇게 10진수는 10의 거듭제곱과 계수(a)의 곱을 하나의 항이라고 하였을 때, 이 항들의 합으로 나타낼 수 있는 수여야 하며, 이 계수의 나열로 표현하게 됩니다. (나열 순서는 멱수의 내림차순입니다.)
이때, 한 체계 안에서 어떤 하나의 수는 그 표현방법이 유일해야 오용을 방지할 수 있기 때문에 이 계수의 범위는 0~9의 정수이며, 10을 기수(base 또는 radix)라고 부릅니다.
여기서 추가적으로 기수를 일반화 하여 10 대신 r이라고 하면 r진수 체계가 되는 것으로 계수의 범위는 0~r-1이 됩니다.

따라서 이진수는 위의 표현 식에서 r=2인 상태로 계수의 값은 0 또는 1이 되는 것입니다.
진법 변환(radix conversion)
그렇다면 서로 다른 진법 간의 변환은 어떻게 하는 것일까요? 십진법이 기본이 되는 체계이므로 r진법과 십진법 사이의 변환을 먼저 살펴봅시다.
우선 r진법에서 십진법으로의 변환은 위의 일반화 식을 그대로 적용시켜주면 됩니다. r진수로 표현된 수가 계수의 나열이란 것을 알았으니 각각에 멱수를 곱해 더하는 계산만 해주면 되는 것이지요. 이진수의 예를 살펴봅시다.

반대로 십진법에서 r진법으로 변환하는 방법은 가장 유명한 나누기의 나머지를 이용한 방법이 있습니다. 공식을 먼저 소개하면 다음과 같습니다.

이 또한 일반화 식을 기반으로 만들어진 공식입니다. 일반화 식을 아래와 같이 정리하면 어떤 십진수 N을 r로 나눈 몫(Q)과 나머지를 구분할 수 있습니다.

보다시피 N을 r로 나눈 나머지가 a0가 되는 것을 확인할 수 있고 Q0을 r로 나누면 마찬가지로 나머지가 a1이 되는 것을 확인할 수 있습니다. 이 과정을 반복해 몫이 0이 될 떄까지 반복하면 구한 나머지를 최근 구해진 순서부터 나열하면 바로 r진수로 표기가 되는 것입니다.
또 다른 방법으로는 제가 개인적으로 이진수 암산에서 쓰는 방법인데 뺄셈을 이용한 방법입니다. 십진수가 2의 n승과 2의 n+1승 사이에 존재하면 2의 n승을 뺴주는 방법을 0이 될 때까지 반복하는 과정으로, 예를 들어 97이라는 십진수를 이진수로 만들고자 할 때, 64≤97<128 이므로 97-64=33 이라고 하고 '64가 있다'라고 생각해 두는 것입니다. 반복하여 32≤33<64 이므로 33-32=1, 1≤1<2 이므로 1-1=0이고, 64, 32, 1이 있었으므로 1 그 사이의 16, 8, 4, 2는 없었으므로 0으로 해서 1100001 이라고 결과를 내는 것입니다.
마지막으로 십진법이 아닌 서로 다른 진수간의 변환의 방법이 있습니다. 바로 2, 4, 8, 16등의 밑을 소수로 한 멱수에서 밑이 같은 경우인데요 이는 간단한게 예를 보고 넘어가겠습니다.

보수(complement)와 음수 확장(negative expansion)
여태까지는 음이 아닌 숫자에 대해서만 다뤘지만 연산의 과정 중에는 뺄셈 연산이 반드시 필요한 경우가 있습니다. 즉, 음수가 필요하게 되는데요, 현재 디지털 컴퓨터에서는 2의 보수 방법을 이용하여 음수를 표현하고 있습니다. 그렇다면 보수(complement)란 무엇일까요?
보수는 보충하는 수를 의미하는 단어로 기저보수라 불리는 r진수 N에 대한 r의 보수는 다음과 같이 정의됩니다.

여기서 n은 N의 총 자릿수를 의미하며 예를 들어 10진수 253에 대한 10의 보수는 1000-253 = 747입니다.

위와 같이 계산의 편의를 위해 감소된 기저보수 방법을 이용하여 계산한 뒤 다시 덧셈을 함으로써 기저 보수를 나타내기도 합니다. 253의 경우에는 (999-253)+1 = 746+1 = 747이 되는 것입니다.
이런 방법은 이진수 체계에서 용이하게 사용되는 방법인데요, 예를 들어 이진수 1100001에서 각 비트를 반대 비트로 전환한 뒤 1을 더하기만 하면 되는 것입니다. 즉, 1100001 → 0011110 +1 = 0011111 으로 만드는 것입니다.
그렇다면 어떻게 보수를 가지고 음수를 표현한다는 것일까요?
바로 비트 수의 물리적 제한을 두는 방법인데요, 컴퓨터의 저장 공간은 무한하지 않기 때문에 제한된 저장 공간을 초과하는 데이터가 없어지는 것을 이용하는 것입니다. 예를 들어 4비트의 저장공간에 5비트의 수 11011을 저장하려 하면 최상위 비트 1이 저장되지 않아 1011만 저장됩니다.
바로 여기에 보수를 이용하는 것입니다. 4비트의 수 0101에 어떤 수를 더하여 5비트의 수 10000를 만들 수 있다면 실제 저장은 0000만 이루어 지는데, 양수에 더하여 0이 되도록 만드는 수는 그 양수의 음수이므로 결국 이진수 체계에선 양수의 2의 보수를 음수라고 정의한 것입니다. 이때, 제한된 저장공간에서 표현할 수 있는 가지수의 절반을 음수로 절반을 0과 양수로 두어 표현하면 최상위 비트(MSB : Most Significant bit)에 따라 음수인지 양수인지를 판별할 수 있게 됩니다. 예로, 4비트에 대한 부호 있는(signed)정수 표현은 다음과 같습니다.
Decimal | Binary | Decimal | Binary |
-8 | 1000 | 0 | 0000 |
-7 | 1001 | 1 | 0001 |
-6 | 1010 | 2 | 0010 |
-5 | 1011 | 3 | 0011 |
-4 | 1100 | 4 | 0100 |
-3 | 1101 | 5 | 0101 |
-2 | 1110 | 6 | 0110 |
-1 | 1111 | 7 | 0111 |
사실 2의 보수를 취하는 더 간단한 방법이 있는데요, 이진수의 최하위 비트부터 최상위 비트의 방향으로 살펴보았을 때, 처음으로 1이 나오는 비트를 그대로 두고 이후 같은 방향의 비트를 모두 전환시키는 것입니다. 예를 들어 11010100이라고 하면 하위 2개의 비트는 0이고 3번째 비트가 1이므로, 하위 3개의 비트를 그대로 두고 나머지 비트를 전환시켜 00101100가 됩니다. 원래의 수와 그 보수를 비트 단위로 보았을 때, 전환시킨 비트의 합은 모두 1이고 전환시기지 않은 1이 위치한 비트의 합은 2이므로 결국 합이 (1)00000000가 되는 것입니다.
16진수(hexadecimal)
마지막으로 16진수(hecadecimal number)를 소개하고 글을 마칠텐데요. 이미 진수에 대해 배웠지만 16진수를 굳이 언급하는 이유는 새로운 표현이 등장하기 때문입니다.
10이 넘는 수를 기저로 하게되면 계수가 10이상이 되는 경우가 발생하는데요 이를 그대로 표기하게되면 표현의 혼란이 일어나게 됩니다. 예를들어 16진수의 10이 자연수로 10이 될 수도, 16이 될 수도 있는 것이죠.
그래서 이런 10 이상의 수를 문자에 대응시키는 방법으로 사용하는데요 코드표는 다음과 같습니다.
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
즉, 16진수 a3f는 자연수로 2623, 이진수로 1010 0011 1111이 되는 것입니다.
이 글에서 진수의 사칙 연산에 대해서는 십진수 체계에서와 그 방법이 다르지 않아 생략하였습니다.