10진수 2진수 변환 공식 원리와 정리

일반적으로 수를 계산할 때 인간은 10진수를 사용합니다. 그래서 10진수가 너무나도 자연스럽게 느껴지겠지만 아마 인간의 손가락이 8개였다면 8진수를 쓰지 않았을까 생각합니다. 물론 16개의 손가락이었다면 16진수가 자연스러울 지도 모르겠죠.

왜냐면 인간이 사용하는 10진수는 꽉 채워진 수가 10임을 의미하며 손가락을 총 동원하여 셀수 있는 숫자가 10인 것과 관련이 있습니다. 이렇게 꽉 채워진 수는 한자리 윗 자릿수로 올림이 발생합니다. 

그런데 10진수의 10은 이미 자릿수가 하나 올라가 있습니다. 왜냐면 인간은 애초에 10진수를 근간으로 수를 사용해왔기 때문에 10을 의미하는 하나로 된 숫자는 없기 때문이다. 구체적으로 0 부터 9까지의 숫자는 하나의 숫자로 표현되지만 9 다음의 수는 자리수를 하나 올림으로써 1과 0으로 표현하기 때문입니다.

이와 같은 맥락으로 2진수는 1과 0으로만 수를 표현하므로 1다음의 수에서 자리올림이 발생합니다. 따라서 1, 2, 3, 4를 2진수로 변환하면 1, 10, 11, 100 이렇게 되는 것이죠.

주의할 것은 우리가 10을 말할 때 특별한 언급이 없으면 9다음의 수 10을 의미하지만 애초에 인간의 손가락이 8개였다면 0부터 7까지의 숫자를 사용하는 수 체계를 10진수라고 했을겁니다.

8진수의 10 역시 7다음의 수이며 16진수의 10은 15(f)다음의 수입니다.

너무 당연한 설명이지만 이렇게 당연한 내용으로부터 학문과 기술은 발전합니다. 그리고 위 내용으로부터 한가지 공통적인 법칙을 끄집어 낼 수 있습니다.

① x진수의 수를 x로 나누면 소수점이 왼쪽으로 1자리씩 이동합니다.

10진수 123을 10으로 나누면 12.3 (몫 : 12, 나머지 : 3)

10진수 12를 10으로 나누면 1.2입니다. (몫 : 1, 나머지 : 2)

2진수 10101을 2로 나누면 1010.1 (몫 : 1010, 나머지 : 1)

2진수 1010을 2로 나누면 101.0 입니다. (몫 : 101, 나머지 : 0)

8진수 67213을 8로 나누면 6721.3 (몫 : 6721, 나머지 : 3)

8진수 6721을 8로 나누면 672.1 입니다. (몫 : 672, 나머지 : 1)

...

② 10진수 A를 x진수 B로 변환했다고 하더라도 A와 B는 같은 크기를 가진 수입니다. 단지 표현 방식만 다른 것이죠.

따라서 A를 x로 나누었을 때의 나머지는 B를 x로 나누었을 때의 나머지와 같습니다.

①번 원리에서 x로 나누었을 때 소수점 이하로 내려가는 수는 나머지를 의미합니다.

②번 원리에서 10진수 A와 2진수 B가 같은 수일 때 A를 2로 계속 나누어 나머지를 구하는 것은 B를 2로 계속 나누어 나머지를 구하는 것과 같습니다.

다음 그림을 보세요.

10진수 7과 2진수 111은 같은 수 입니다. 이 두를 2로 나눈 후 또 다시 그 몫을 다시 2로 나누고 몫이 0이 될 때까지 이 작업을 반복해 보겠습니다. 어짜피 10진수 7과 2진수 111은 같은 수이므로 위와 같이 몫을 계속 2로 나눌 때 나머지의 패턴이 동일합니다.

이 때 ①에서 설명했듯이 x진수를 x로 나누면 1의 자리의 숫자가 나머지로 추출 됩니다. (현재 나누어지는 수의 LSD가 추출된다.)

즉 2로 나눌 때 마다 1의 자리수 추출(나머지),  원래의 숫자에서 소수점 왼쪽으로 이동의 패턴을 반복하므로 결국 마지막에 추출되는 나머지는 x진수의 제일 왼쪽의 숫자(MSD : Most Significant Digit), 제일 처음에 추출되는  나머지는 x진수의 가장 오른쪽의 숫자(LSD : Least Significant Digit)가 됩니다.


문제) 1330을 2진수로 변환해 보자.

1330을 더 이상 나누어지지 않을 때까지 2로 나누었습니다. 화살표 방향의 순서로 숫자를 적어본 후 계산기로 계산한 2진수의 값과 동일한지 확인했습니다.


음의 10진수나 정수가 아닌 실수를 2진수로 바꾸는 방법은 여기 를 참고하시길 바랍니다.

이 댓글을 비밀 댓글로
    • No name
    • 2018.03.11 16:35
    진수변환 원리가 궁금했는데
    이해가 잘됬습니다.
    • 2019.07.08 22:20
    비밀댓글입니다
    • 감자조아
    • 2019.11.13 08:32
    내용 잘 읽었습니다. 감사합니다.
    • ㅇㅇ
    • 2020.02.20 16:09
    X진수를 X로 나누면 소수점이 뒤로 밀려나는 것이 핵심이네요.
    잘 배워갑니다~
    • ㅁㅁㅁ
    • 2020.06.22 17:19
    진짜 궁금한건데, 비트 연산, 쉬프트 비트 연산은 어떨 때 쓰는 건가요?
    비트를 바꿔서 어디에 쓰는 것인가요?
    • 어디든 쓸 수 있습니다. 수학을 어디에 써먹냐는 것과 비슷합니다. 비트연산을 몰라도 프로그램을 짤 수 있지만 알고 있다면 좋겠죠.
      예를들어 피자 토핑 프로그램이 있다고 해보죠. 8개의 토핑을 골라서 피자를 만드는 겁니다. 이 때 8개의 토핑에 대한 변수를 만든다고 하겠습니다. int형 변수로 만들면 32bit * 8의 메모리가 필요합니다. 4byte*8 = 32byte의 저장소가 필요합니다. 이 걸 비트연산으로 하면 8bit면 됩니다. 32배의 차이가 나죠. 한국 인구정도의 사람에 대한 토핑 정보를 DB에 저장한다고 해보죠. 32배 차이면 32GB의 저장용량을 bit연산으로 1GB로 줄일 수 있습니다.
      여러가지 트릭이 있겠으나.. 보통 개발하다보면 귀찮아서 비트연산 안하고 그냥 씁니다. 하지만 제대로만 쓰면 품질이 달라집니다.
    • 혹등고래
    • 2021.01.04 03:02
    진수의 원리가 궁금했는데,, 콘파냐센세 멋있습니다.
    • 혹등고래
    • 2021.01.04 03:05
    주입식교육의 폐해로 원리를 알지 못 하였네요.. 감사합니다