본문 바로가기

it관련

진수란? 진법변환이란? 진법변환이 필요한 이유

반응형

진수란? 진법변환이란? 진법변환이 필요한 이유


실제 컴퓨터 메모리에 저장되는 데이터는 0101000011 이런식으로 저장이 됩니다. 

이렇게 표현 하는 진법을 0과1 2개의 수로 표현 한다해서 2진법이라 부릅니다. 

 

프로그래머들은 가끔씩 메모리에 데이터가 어떻게 저장되어 있는지 알아야 할 필요성이 있습니다. 하지만 내부에는 10101223와 같이 2진법으로 표현 되어 있기 때문에 읽기가 쉽지 않아서 진법을 변환해서 우리가 사용하는 10진법이나 주소체계에서 사용되는 16진법등으로 변환해서 이해하는 것 입니다. 

 

이렇게 사용하는 것은 데이터의 이해에도 좋겠지만 데이터를 저장하고 사용할 때도 많은 이점을 가지고 있습니다.  

 

우리가 사용하는 10진법으로 사용을 하면 편하겠지만 컴퓨터가 좋아하는 수는 0과1 즉 

2의 n승으로 증가하는 법칙을 가진 진법을 좋아합니다.  

 

메모리에 저장되는 단위는 최소 단위가1비트씩 바이트 단위 즉 8개의 비트로 이루어져있는 단위를 좋아합니다.  

0과 1로 이루어진 숫자가 8개 존재하게 됩니다.

 

8진법으로 표현 하면 4개로 표현 가능하고 16진법으로 표현 하면 2개의 숫자로 표현이 가능합니다.  

 

정리해 보자면 진법변환을 사용하는 이유는 프로그래머가 편하게 내부데이터를 표현하기 위함이라고 생각하시면 되겠습니다.

 

기수법

기호를 사용하여 수를 나타내는 방법

 

로마식 기수법( I, II, III )

중국식 기수법( 一, 四, 十 )

인도식 기수법( 111, 23, 231 )

 

현재 널리 사용되는 기수법은 인도식 기수법 입니다.

 

진법 과 진수

진법은 기수법에서 각 자리수의 범위가 몇인지를 나타내는 단위 입니다.

진법이라 하면 수를 표현 하기위해 사용되는 숫자의 개수라고 이해하면 편합니다.

진수는 진법으로 만들어진 수를 의미합니다.

8진법 0 부터 7까지 8개의 숫자로 표현되는 진법을 의미 합니다.

그러면 진수는 8진법으로 표현된 수를 8진수라고 하는것입니다.

10진법은 0 부터 9까지 10개의 숫자로 표현된 수를 10진법이라 하고

123과 같이 10진법으로 표시된 백 이십 삼 을 우리는 10진수 123이라 합니다.

일반 적으로 사용하고 있는 아라비아 숫자는 10진법입니다. 컴퓨터는 위에서 언급한것처럼 2진법으로 표현을 합니다.

많이 쓰이는 진법에는 2진법,8진법, 10진법,16진법등이 있습니다.

2진법 1은 1 , 8진법1은 1 , 10진법 1은 1 , 16진법 1은 1이렇게 쓰면 어떠한 일인지 잘 분간이 가지 않기 때문에 괄호를 붙여 진법을 표시합니다.

1(2), 1(8), 1(10), 1(16) 이렇게 쓰면 어떠한 진법의 1인지 정확히 알수가 있습니다.

 

진법변환

 

진법 변환은 기존에 표현 되던 진법의 진수를 다른 진법의 진수로 바꾸는 방법입니다. 

 

아래는 모든 진법변환에 사용되는 공식입니다. 한번 이해해 두시면 모든 진법변환을 하실 수 있습니다.

 

N이라는 진수에서 M이라는 진수로 바꾸는 방법을 수식으로 표현 하면  

각각의 자리를 아래의 공식을 이용해서 10진법으로 변환한다.


위의 수식으로 변환된 수를 M으로 나눈다.

나머지를 제외한후 다시 몫을 M으로 나눈다.

이과정을 반복하여 몫이 M보다 작아 지면 마지막 몫의 자리의 수와 나머지들을 모두 아래서 부터 나열하여 쓰면 변환이 완료 됩니다.

 

말로 하니 굉장히 복잡해 보입니다.  

 

2진법 1011 에서 16진법으로 변환하는 방법을 예제로 들어서 설명해 보도록 하겠습니다.

 

여기에서 2진법은 N에 해당됩니다.

16진법은 M에 해당이 됩니다.


각각의 자리를 변환하고자 하는 수 * N(자리수-1)의 공식을 이용해서

10진수로 변환을 합니다. 

 

1011을 뒤에서 부터 변환을 시작합니다.


1번째 자리의 수 1011을 변환합니다.

1 * 2( 1- 1) = 1* 2의 0승이됩니다. 모든자리의 0승은 1이되므로

1 * 1 = 1이 됩니다.

 

 

2번째 자리의 수 1011을 변환합니다.

1 * 2( 2 - 1) = 1 * 2의 1승이됩니다. 2의 1승은 2이므로

1 * 2 = 2가 됩니다. 

 

3번째 자리의 수 1011을 변환합니다.

0 * 2( 3 - 1) = 0 * 2의 2승이 됩니다. 2의 2승은 4이므로

0 * 4 = 0이 됩니다. 

 

4번째 자리의 수 1011을 변환합니다.

1 * 2( 4- 1) = 1 * 2의 3승이 됩니다. 2의 3승은 8이므로

1 * 8 = 8이 됩니다. 

 

이렇게 변환된수를 모두 더해 주면 10의 진수가 됩니다.

1 + 2 + 0 + 8 = 11이 됩니다.

2진법 1011은 10진법으로는 11이 되는것입니다.

 

자 이제 이렇게 변환된 수를 M 즉 16진수로 나누면 됩니다.

16진수는 10을 A로 11을 B로 12을 C로 13를 D로 14를 E로 15를 F로표현 합니다.

10진수와 차이를 두기 위해서 입니다. 아래에서 자세히 다시 해보도록 할테니 이렇게

아시면 됩니다.

11을 16으로 나누게 되면 몫은 0이고 나머지가 11입니다.

몫이 16보다 작으므로 더이상 나누지 않고 나머지를 사용하게 됩니다.

그래서 2진수 1011은 16진수로 표현하면 마지막 몫의 자리 0과 11을 변환한 B를 사용해

서 "0B" 가 되는것입니다.

공식에 대입해서 예제를 풀어봤습니다.  이제 각각의 진법변환을 자세히 알아보도록

하겠습니다.

2진수의 진법 변환

2진수는 4자리 단위로 표현이 가능합니다. 만일 자리가 모자란다면 모자란 자리수는 모

두 0으로 채워서 표시합니다.

0101 1010(2)

여기에서도 모든 자리를 표현 하면 앞자리에 0을

제외한 수가 모두 7자리 이므로 8자리(4자리 단위)로 채우기 위해 0을 채워

0101 1010(2)로 표현 합니다.

2진수에서 10진수로의 진법변환

2진수 0101 1010(2)를 2진수에서 10진수로의 진법 변환 하겠습니다.

위에서 언급한 공식중  각각의 자리를 변환하고자 하는 수 * N(자리수-1)의 공식을 이용

해서 10진수로 변환을 합니다. 위에서도 언급했듯이 모든 수의 0승은 0입니다.^^

0101 1010(2)  뒤에서 부터 시작 합니다.

1번째 자리 : 0 * 2(0) = 0 * 1 = 0

2번째 자리 : 1 * 2(1) = 1 * 2 = 2

3번째 자리 : 0 * 2(2) = 0 * 4 = 0

4번째 자리 : 1 * 2(3) = 1 * 8 = 8

5번째 자리 : 1 * 2(4) = 1 * 16 = 16

6번째 자리 : 0 * 2(5) = 0 * 32 = 0

7번째 자리 : 1 * 2(6) = 1 * 64 = 64

8번째 자리 : 0 * 2(7) = 0 * 128 = 0

이제 모든 자리의 수를 더하면 10진수가 됩니다. 

0 + 2 + 0 + 8 + 16 + 0 + 64 = 90

2진수 0101 1010(2)은 10진수 90이 됩니다.( 검산은 10진수를다시 2진수로 바꿔 보면 됩

니다. 10진수 변환을 본후 여기에서의 수를 검산해 보세요^^)

2진수에서 8진수로의 진법변환

2진수에서 10진수로 변환하는 과정을 생략하기 위해서 위에서 사용한 수를 계속 사용하

도록 하겠습니다.

0101 1010(2) 을 10진수로 변환하면 90이 됩니다.( 2진수 에서 10진수로 변환에서 예제)

이제 90을 M진수 즉 8진수 8로 나누어서 쓰면 되겠습니다.

90 / 8 = 11 .... 2

11 / 8 = 1  .... 3

이제 몫이 1이므로 마지막 자리의 몫 1과 나머지 3,2를 사용해서

0101 1010(2)  -> 132(8) 이 됩니다.

2진수에서 16진수로의 진법 변환

0101 1010(2)를 10진수로 변환하면 90입니다.(이제 아시죠^^)

이제 90을 M진수 즉 16으로 나누어서 쓰면 되겠습니다.

 

90 / 16 = 5  .... 10

이제 몫이 5이므로 마지막 자리의 몫 5 와 나머지 10을 사용하는데 10은 A로 표현 됩니

다.^^ 위에서 언급했죠.

0101 1010(2)  -> 5A(16) 가 됩니다.

8진수의 진법 변환

여기에서는 8진수를 각각의 진법으로 변환하면서 방법을 알아 보도록 하겠습니다.

8진수에서 2진수로의 진법 변환

검산을 위해서 2진수에서 변환했던 수를 그대로 사용하겠습니다.

10진수 90을 8진수로 표현하면 132(8) 이된다고 했습니다.

그러면 10진수로 변환하면 90이 되는지 알아 보도록 하겠습니다.(일단 검산완료^^)

132(8)을 뒤에서 부터 변환 합니다. 10진수로

1번째 자리 : 2 * 8(0) = 2 * 1 = 2

2번째 자리 : 3 * 8(1) = 3 * 8 = 24

3번째 자리 : 1 * 8(2) = 1 * 64 = 64

2 + 24 + 64 = 90

오오 원래 90에서 8진수로 변환한 수132가 다시 90이 되었습니다.

이걸 다시 2진수로 나누어 보면

M진수 2로 계속 나누어 보면 2진수가 표현이 되겠죠?^^

90 / 2 = 45 .... 0

45 / 2 = 22 .... 1

22 / 2 = 11 .... 0

11 / 2 = 5  .... 1

5  / 2 = 2  .... 1

2  / 2 = 1  .... 0 

몫이 1이고 2보다 작으므로 마지막 몫과 나머지들을 모두 사용합니다. 

하지만 모두 사용해도 7자리밖에 안되므로 맨앞의 빈칸에 0을 채워서 사용합니다.

0101 1010(2) 처음에 2진수가 나타났네요 이로써 2진수에서 8진수로 변환한것도 맞는 

검산식이 성립했네요 

 

8진수에서 10진수로의 진법 변환

8진수 에서 8진수로 변환 하는것은 위에서 언급 했기 때문에 그대로 인용해서 언급

하도록 하겠습니다. 132(8)을 뒤에서 부터 변환 합니다. 10진수로

1번째 자리 : 2 * 8(0) = 2 * 1 = 2

2번째 자리 : 3 * 8(1) = 3 * 8 = 24

3번째 자리 : 1 * 8(2) = 1 * 64 = 64

2 + 24 + 64 = 90 이 됩니다.

8진수에서 16진수로의 진법 변환

8진수에서 10진수로 변환은 위에서 했고 10진수 90에서 16진수로 변환 한것도

했으므로 패스 하도록 하겠습니다.

 

10진수의 진법 변환

10진수의 진법 변환은 위에서 많이 언급한 방법에서 가장 핵심입니다.

어떠한 진법이던 아래의 공식을 대입하면 10진수로 변환이 완료 됩니다.

그러니 이식을 항상 유념 하시기 바랍니다.

간단히 10진수 500을 16진수와 2진수로 표현 하는 방법도 아래 수식으로 표현 했습니다.

10진수 500 에서 16진수로 변환 하는 법


16진수 에서 10진수로 변환 하는법


여기 까지 보시면서 느끼시는 공통점이 생기셧죠? 그렇습니다.

모든 진법변환에는 공통적으로 10진수로 변환을 하게되면 조금더 편하게 하실수 있고

공통적인 부분만 숙달 되시면 모든 수의 진법을 변환할 수 있습니다.

10진수의 변환중 가장 힘든부분이 바로 실수의 2진수로의 변환입니다.

의외로 많은 분들이 모르시는 부분이기도 합니다.

소수형태의 값을 2진수로 변환하는 방법은

해당 값에 2를 곱해서 결과 값이 1을 넘지않으면 0 ,결과값이 1이 나오면 1을 취하고

변환을 완료합니다. 만약 결과값이 1을 넘으면 1을 취하고 결과값에서 1을빼고 결과값이

1이 나올때까지 이과정을 반복하면 됩니다.

8.15 라는 10진수로 표현된 소수를 2진수로 변환해 보도록 하겠습니다.

소수 부분 0.15에 대한 2진수 변환을 먼저 합니다.

[이미지를 클릭하시면 큰 이미지를 보실수 있습니다]

이렇게 10진수 실수를 2진수로 하는 방법까지 알아봤습니다.

16진수의 진법 변환


16진수의 진법변환을 하기전 표현 법을 잠시 보도록 하겠습니다.

위의 표에서도 확인 할수 있듯이 10진수로 표현 가능수는 0 ~ 15까지 입니다.

하지만 10진수 10과 16진수의 10이 같이 표현되기 때문에 10부터는 A ~ F까지의 문자로

표현 하는것을 알수 있습니다.

2진수로 표현할 때도 4자리 단위로( 프로그램에서는 니블(nibble)단위 라고 합니다.)

끊어서 16진수 하나가 매칭 되는것을 알수 있습니다.

1byte를 표현하기 위한 8비트이면 16진수 2개로 FF 이렇게 표현이 가능한것이죠.

그러면 많이 보던 주소중 0x32f3ac3c 는 16진수 였다는 것을 알수 있습니다.

그렇습니다. 메모리 체계에서 주소는 16진수로 관리 되고 있는 것입니다.

16진수 8개이면 32비트를 표현 할수 있으니까요.

자이제 진법을 변환 해보도록 하겠습니다.

10진수를 16진수로 16진수를 10진수로 하는것은 위에서 언급했으니

2진수에서 16진수로 16진수를 2진수로 표현해 보도록 하겠습니다.

여태까지 사용하던수 90(10)을 사용하도록 하겠습니다.(검산이 쉽게 되니까요)

위에서 90을 16진수로 표현하면 5A가 된다고 했습니다.

그럼 5A에서 10진수로 변환을 해보도록 하겠습니다.

1번째 자리 A는 10이 된다는 것을 유념하세요

1번째 자리 : 10 * 16(0) = 10 * 1 = 10

2번째 자리 : 5 * 16(1) = 5 * 16 = 80

이제 각자리를 더해보면

10 + 80 = 90

10진수로 변환하면 90이 되는것을 확인했습니다. 여태까지 동일 한 수를 사용한것은

각각 검산을 해보기 위함 이니 제대로 된것을 확인한 것이죠.

90을 2진수로 바꾸는 방법은 2진수에서도 언급했고 8진수에서도 언급했으니 패스하도록

하겠습니다.

지금까지 진법 변환에 대해서 알아보았습니다.

2진수에서 16진수로 변환을 할때에 간단한 방법도 존재 합니다.

0101 1010(2) 일경우 4자리 니블(nibble)단위로 쪼개서 그수를 10진수로 한후 바로

16진수로 변환하면 됩니다.

0101 -> 10진수로 변환하면 1 * 1 + 0 * 2 + 1 * 4 + 0 * 8 = 5

1010 -> 10진수로 변환하면 0 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 10 = A

그래서 앞에서 부터 5A 이렇게 변환이 바로 가능하기도 합니다.

하지만 공통적인 수식이 익숙해 지시기 까지 연습을 하시기 바랍니다

반응형

'it관련' 카테고리의 다른 글

포토샵/일러스트 해상도 설정하기  (0) 2017.06.08
포토샵 단축기 모음  (0) 2017.06.08
컴퓨터에서 1의보수 2의보수가 필요한 이유  (0) 2017.06.07
제닉스(XENICS)  (0) 2017.06.07
아이핀(I-PIN) 이란  (0) 2017.06.07