∴ 진법

- 컴퓨터는 기본적으로 0과 1로 표현됩니다.
실제 컴퓨터 메모리에 저장되는 데이터는 01000101 과 같은 형태로 저장됩니다.
위와같이 0과 1로 표한하는 진법 방식을 2진법이라 합니다. - 프로그래머는 메모리에 데이터가 어떤식으로 저장되어 있는지 알아야 할 필요성이 있습니다.
하지만, 프로그램 내부에서는 010001010과 같은 2진법으로 표현되어 있어 읽기가 쉽지 않기 때문에 우리가 사용하는 10진법이나 주소체계에서 사용되는 16진법 등으로 변환해서 이해하는 것 입니다. - 데이터의 이해에도 좋고 데이터를 저장하고 사용할 때도 많은 이점을 가지고 있습니다.
컴퓨터는 10진법이 아닌 0과 1로 된 2의 n승으로 증가하는 법칙을 가진 진법을 좋아합니다. - 메모리에 저장되는 단위는 최소 단위가 1비트씩 바이트 단위로, 8개의 비트로 이루어져 있는 단위를 좋아합니다.
0과 1로 이루어진 숫자가 8개 존재하는 것이죠. - 8진법의 경우 4개로 표현가능하고 16진법으로 푷현하면 2개의 숫자료 표현이 가능
- 결국 프로그래머가 편하게 내부데이터를 표한하기 위해 진법변환을 사용하는 이유|
∴ 기수법
- 기호를 사용하여 수를 나타내는 방법
로마식(Ⅰ,Ⅳ,Ⅹ), 중국식(一,十,萬) , 인도식(1, 123, 222) - 현재 많이 사용되는 기수법은 인도식 기수법
∴ 진법과 진수
- 진법 : 기수법에서 각 자리수의 범위가 몇인지 나타내는 단위
수를 표한하기 위해 사용되는 숫자의 갯수 - 진수 : 진법으로 만들어진 수
8진법의 경우 : 0~7까지 8개의 숫자로 표현되는 진법
진수는 8진법으로 표현된 수를 8진수 - 10진법 : 0~9까지 10개의 숫자료 표현된 수
273과 같은 10진법으로 표시된 이백 칠십 삼 을 10진수 273이라 합니다. - 컴퓨터의 경위 2진법으로 표현하고 많이 사용되는 진법으로는 2진법, 8진법, 10진법, 16진법이 있습니다.
보통 진법의 구분의 경우 1(2), 1(8), 1(10), 1(16) 과 같은 형태로 진법을 표시합니다.
∴ 진법변환
- 기존에 표현되던 진법의 진수를 다른 진법으로 바꾸는 방법
- 주로 사용되는 진법변환에 사용되는 공식
N이라는 진수에서 M이라는 진수로 바꾸는 방법을 수식으로 표현하면
각각의 자리를 아래의 공식을 이용해 10진법으로 변환한다.
- 위의 수식으로 변환된 수를 M으로 나눈다.
나머지를 제외한 후 다시 몫을 M으로 나눈다.
이 과정을 반복하여 몫이 M보다 작어지면 마지막 몫의 자리의 수와
나머지들을 모두 아래에서부터 나열하여 쓰면 변환이 완료됩니다. - 예를 들어 1101(2)를 16진법으로 변환하는 방법
2진법은 N, 16진법은 M - 첫번째 자리
1 * 2^(1-1) = 1 * 2^0 (모든 자리의 0승은 1)
1 * 1 = 1
두번째 자리
0 * 2^(2-1) = 0 * 2^1
0 * 2 = 0
세번째 자리
1 * 2^(3-1) = 1 * 2^2
1 * 4 = 4
네번째 자리
1 * 2^(4-1) = 1 * 2^3
1 * 8 = 8
위의 숫자를 모두 더하면
1+0+4+8 = 13
10진법 13으로 변환 - 변환된 수(13)을 M 즉, 16진수로 나누면 된다.ㅣ
16진수 10=>A / 11=>B / 12=>C / 13 => D / 14=>E / 15=>F 로 표현
10진수와의 차이를 두기 위해 사용합니다. - 13을 16으로 나누면 몫은 0 나머지가 13
몫이 16보다 작으므로 나머지를 사용하게 됩니다.
2진수 1101을 16진수로 표현하면 마지막 몫의 자리 0과 13을 변환한 D를 사용
"0D"가 됩니다.
∴ 2진수 = > 10진수
- 1001 1110(2) 를 변환해보겠습니다.
- 공식을 대입하여 10진수로 변환(모든수의 0승은 0)
1001 1110(2) 뒤에서 시작
1번째 : 0 * 2(0) = 0 * 0 = 0
2번째 : 1 * 2(1) = 1 * 2 = 2
3번째 : 1 * 2(2) = 1 * 4 = 4
4번째 : 1 * 2(3) = 1 * 8 = 8
5번째 : 1 * 2(4) = 1 * 16 = 16
6번째 : 0 * 2(5) = 0 * 32 = 0
7번째 : 0 * 2(6) = 0 * 64 = 0
8번째 : 1 * 2(7) = 1 * 128 = 128
0+2+4+8+16+0+0+128 = 158 - 2진수 1001 1110은 10진수 158이 됩니다.
(검산 : 10진수를 다시 2진수로 바꿔어 보면 됩니다.) - 검산
158 / 2 = 79 ... 0
79 / 2 = 39 ... 1
39 / 2 = 19 ... 1
19 / 2 = 9 ... 1
9 / 2 = 4 ... 1
4 / 2 = 2 ... 0
2 / 2 = 1 ... 0
마지막의 몫부터 차례대로 읽으면
1001 1110(2) 가 됩니다.
∴ 2진수 = > 8진수
- 1001 1110(2) 을 10진수로 바꾸게 되면 158이 됩니다.
바꾼 수 158을 계속 8로 나누어보도록 하겠습니다. - 158 / 8 = 19 ... 6
19 / 8 = 2 ... 3
몫이 8 보다 작기 때문에 마지막 자리의 몫과 나머지 3,6을 사용
1001 1110(2) => 236(8)
∴ 2진수 = > 16진수
- 1001 1110(2) 는 10진수 158입니다.
158을 M진수=>16으로 나누어 사용한다. - 158 / 16 = 9 ... 14
몫이 16보다 작은 9 와 나머지 9를 이용하여 사용합니다.
1001 1110(2) => 9E(16)
∴ 8진수 = > 2진수
- 검산을 위해 1001 1110(2)를 사용하겠습니다.
10진수 158을 8진수로 표현하면 236(8)
10진수로 변환하면 158이 되는지 부터 확인합니다. - 10진수로
1번째 : 6 * 8(0) = 6 * 1 = 6
2번째 : 3 * 8(1) = 3 * 8 = 24
3번째 : 2 * 8(2) = 2 * 64 = 128
6+24+128 = 158
제대로 변환이 된 것이 확인되었습니다. - M진수 2로 나누면 2진수가 표현 된다.
158 / 2 = 79 ... 0
79 / 2 = 39 ... 1
39 / 2 = 19 ... 1
19 / 2 = 9 ... 1
9 / 2 = 4 ... 1
4 / 2 = 2 ... 0
2 / 2 = 1 ... 0
몫이 1이고 2보다 작으므로 마지막 몫과 나머지를 사용한다.
1001 1110(2) 처음의 2진수가 되었습니다.
만약 갯수가 8개 보다 부족할 경우 앞에 0을 붙여서 사용합니다.
∴ 8진수 = > 10진수
- 위에 했던것과 같이 인용하여 236(8)을 변환하면 아래와 같습니다.
- 10진수
1번째 : 6 * 8(0) = 6 * 1 = 6
2번째 : 3 * 8(1) = 3 * 8 = 24
3번째 : 2 * 8(2) = 2 * 64 = 128
6+24+128 = 158
∴ 8진수 = > 16진수
- 8진수에서 10진수변환과 10진수에서 16진수 위에 했으므로 각설하고
혼자 연습해 보시길 바랍니다.
∴ 10진수의 진법변환
- 어떠한 진법이던 아래의 공식을 대입하면 10진수로 변환이 완료

- 10 진수 400 을 16진수와 2진수로 표현하는 방법도 간단합니다.
400 / 16 = 25 ... 0
25 / 16 = 1 ... 9
190(16)
1 * 16^2<256> + 9 * 16^1<16> + 0 * 16^0<1> = 256 + 144 + 0 = 400
∴ 10진수의 변환 중 실수 2진수로의 변환
- 소수형태의 값을 2진수로 변환하는 방법
해당 값의 2를 곱해서 결과 값이 1을 넘으면 0, 결과값이 1이 나오면 1을 취하고 변환을 완료
위의 글을 무한반복입니다. - 예제 : 8.45 를 10진수로 표현된 소수를 2진수로 변환
소수 부분 0.45에 대한 2진수 변환
01차 : 0.45 * 2 = 0.9 .... 0 (1을 넘지않아 0을 취함)
02차 : 0.90 * 2 = 1.8 .... 0 (1을 넘지않아 0을 취함)
03차 : 0.80 * 2 = 1.6 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.)
04차 : 0.60 * 2 = 1.2 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.)
05차 : 0.20 * 2 = 0.4 ... 0 (1을 넘지않아 0을 취함)
06차 : 0.40 * 2 = 0.8 ... 0 (1을 넘지않아 0을 취함)
07차 : 0.80 * 2 = 1.6 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.)
08차 : 0.60 * 2 = 1.2 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.)
09차 : 0.20 * 2 = 0.4 ... 0 (1을 넘지않아 0을 취함)
10차 : 0.40 * 2 = 0.8 ... 0 (1을 넘지않아 0을 취함)
11차 : 0.80 * 2 = 1.6 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.)
12차 : 0.60 * 2 = 1.2 ... 1 (1을 넘어 1을 취하고 결과에서 1을 뺀다.) - 0.45 => 0011 0011 0011 이런식을 반복.
8 => 1000(2)
∴ 16진수의 변환
- 16진수에서 10진수로 표현가능한 수는 0 ~ 15
10진수 10과 16진수의 10이 같이 표현되어서 10부터는 A~F까지의 문자로 표기
2진수로 표현할 때 역시 4자리 단위로 (Nibble<니블>) 표기 - 끊어서 16진수 하나가 매칭되는 것을 알 수 있다.
1byte를 표현하기 위해 8비트이면 16진수 2개 FE 이렇게 표현이 가능.
예를 들면, 메모리 주소에서 많이 쓰이는 0x31fe3f1ac 는 16진수
즉, 메모리 체계에서 주소는 16진수로 관리된다. 16진수 8개 이면 32비트를 표현할 수 있습니다.
∴ 16진수의 변환
- 10진수 <=> 16진수로 하는것은 위에서 언급했으니 제외하고
2진수 <=> 16진수를 해보도록 합니다. - 기존에 사용하던 수 158(10) 을 사용!!!!
158 을 16진수로 표기하면 9E(16)
9E(16) 을 10진수로 변환 - 1번째 자리 : 15 * 16(0) = 14 * 1 = 14
2번째 자리 : 9 * 16(1) = 9 * 16 = 144
14 + 144 = 158 - 1001 1110(2) 16진수로 볂환시 간단한 방법
4자리 니블(Nibble) 단위로 조개서 10진수로 한 후 16진수로 변환
1110 => 0 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 14 => E
1001 => 1 * 1 + 0 * 2 + 0 * 4 + 1 * 8 = 9
9E(16)로 변환이 완료 되었습니다. - 이 글을 보시는 여러분들도 여러 숫자를 가지고 재미난 진법변환 해보시기 바랍니다!!!!




최근 덧글