본문 바로가기

프로그래밍./공통 내용

진법의 정의, 개념, 변환, 총 정리.

진법의 정의, 개념, 변환, 총 정리.
진법의 정의, 개념, 변환, 총 정리.
진법의 정의, 개념, 변환, 총 정리.

2진법 8진법 16진법, 2진법 8진법 16진법, 2진법 8진법 16진법
2진수 8진수 16진수, 2진수 8진수 16진수, 2진수 8진수 16진수


단순 암기보다. 한번만 이해하면 어쩌면 평생을 기억할 지도 모른다.
암기가 아닌 원리를 파악하고 이해하자.


진법이란? 묶는 방법을 의미 한다.

따라서 일반적으로 10진법을 쓰고 IT 쪽에서는 2진법 8진법, 16법을 쓰지만
자기 쓰기 나름이고 묶기 나름이다. 진법이 정해진 것은 아니다. 고로 무한하다.

사탕이 23개가 있다. 이것을 어떻게 표현할 것인가.


10개씩 묶는다. 그러면 3개가 남는다.   3을 쓰고. 10개씩 묶은 2를 앞에 써준다. => 3 => 23.
이게 일반적으로 우리가 배우는 산수? 이다. 하지만 여기서, 왜 10개씩 묶어야 하나?
그건 우리가 0~9를 표현하는 10진법을 사용하기 때문이다. 10개씩 묶는 10진법으로 표기 하기 위해서 이렇게 한다.


그렇다면 8진법은?


원리는 동일하다. 8개씩 묶고 7개가 남았다. 남은 7을 쓰고 8개씩 묶은 2를 앞에 써준다. => 7 => 27(8)
(8)은 8진수를 알리기 위한 표시이다.



16진법 도 마찬가지.

16개를 묵고 남은 7개. 남은 7개를 써주고 그 앞에 묶은 개수를 써준다. =>7 =>17(16)
만약 위 그림처럼 묵고 7개가 아닌 13개가 남았다 한다면? 멍~???
정답은 1D(16) 이 되는 것이다.


여기서. 중요한 키 포인트 하나.
이렇게 표기를 하다 보면 10이. 10진수의 것과 헛갈리니까. 물론, 몇진법 수인지 옆에 적어주긴 하지만.

그래서 10부터 A, B, C, D, E, F 로 표기하는 것이다. 의미는 없다.
우리나라 사람이 먼저 발견했다면 ㄱㄴㄷㄹㅁㅂ 되었을지도.

다음은 자리수에 대해서 보기 위해 3진법을 보도록 하자.

3개씩 쭉 묵고 2개가 남았다. 그렇다면 2를 적고. 3개씩 묶은 7을 적는다? => 2 =>72 ?
순간 멍 때리면 이렇게 된다. 여기서. 키 포인트 둘.
각각의 숫자는 진법의 수를 넘을 수 없다.

10진법이 0~9이듯, 9에서 +1 되면 자리수가 1개 올라간다.
8진법은 7이상 나올 수 없다. 8이라면 10(8) 이 되게 된다. 자리수가 1개 올라가고 남은 것은 없다.
10(십) 이라고 생각하면 안되고, 8개씩 1개 묶고 나머지가 없다고 생각해야 된다.
즉, 1 0 (일공)이라고 생각해야 헛갈리지 않는다.
16진법은 0~15 까지.

그렇다면 어떻게 해야 되나? 자기 진법 수 보다 높으면 자리수가 올라간다고 했다.
3개씩 묶었는데 7개가 나왔다면 그 3개씩 묶은 것들을 다시 묶을 수 있지 않은가?
 

그렇다면 3개씩 2 묶음이 되고 파란(3묶음)은 1개가 남는다. 그럼 아까 남은 2 앞에 써주고.
묶은것을 다시 묶은 2를 써준다.
=> 2 => 12 => 212(3)

2진법을 보도록 하자.

2개씩 11개가 나왔고 나은개 1. => 1


11개가 나온 것을 2개씩 묶어서(빨간박스) 5개가 나오고 1개의 파란 박스가 남음. => 11



5개가 나온 것을 2개씩 묶어서(녹색 동그라미) 2개가 나오고 1개의 빨간 박스가 남음 => 111


마지막으로
2개가 나온 것을 2개씩 묶어서(노란 동그라미) 1개가 나오고 남은 녹색 동그라미는 없음.
따라서 남은 것은 0이고 묶음은 1개가 된다. => 10 111 => 10111(2)

이게 진법의 원리이다.

또 다른 방식으로 하자면. 일반적으로 알고 있는 나누기 방식.


23의 경우 16진법은  23을 16으로 나누면 나머지는 7. 그래서 17(16) 이렇게 된다.
16개씩 묶는 다는 의미가 16씩 나눈다는 의미와 동일하다는 뜻이다.

원래 이렇게 묶고 하는 것을 수식으로 나누기로 해서 배운 것이다.

특히 2진법의 경우. 2의 배수로 올라가게 된다. 2개씩 묶은 것을 2개씩 다시 묶으니까 개수는 2배로 올라가게 된다.
0 -> 0
10 - > 2
100 -> 4
1000 -> 8

요놈을 자리수로 보자면. 가로로 보자면 아래처럼 된다.
8 4 2 1
0 0 0 0    

이것을 또. 일반적인 수학으로 하면.. ^은 승을 이야기 한다. 2^3 은 2에 3승. 즉 2에 3제곱
0 -> 2^0
10 - > 2^1
100 -> 2^2
1000 -> 2^3

그래서. 10110 을 수식으로 바꾸면
1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 =  22
16  + 0 + 0 + 4 + 2 + 0 = 22

그래서 몇 승이던 0을 곱하면 0 이기 때문에 1인 자리만 계산을 한다.
1*2^4 + 1*2^2 + 1*2^1 =  22
16 + 4 + 2 = 22

이놈을 자릿수로 보자면
16 8 4 2 1
 1 0 1 1 0  이렇게 되 있는 것과 마찬가지이다. 2배수로 늘어나고. 자리수 마다 값이 있으므로.

그럼 수식처럼 계산 안하고 그냥 눈대중으로도 16 + 4 + 2 가 가능하다.
반대로도 마찬가지다. 22를 2진수로 하고 싶다면. 2 배수중 22보다 가장 작은 16. 자리에 1을 넣고
그럼 6이 남았는데. 8은 6보다 크니까 안되고. 그 다음 4 자리에 1넣고. 그리고 2자리 1넣고. 나머지 0.

아니면 16자리에 1넣고 남은 6은 8 4 2 1 로 6나오게 껴맞추면 되는거다. 이정도 못할까.
8 4 2 1 조합으로 6 못만들면 그건..... - 0-;;

흠. 정확한(?) 원리를 하자면 빼기를 이용하면 된다.

예를 들어 419 라고 한다면.

2의 배수중에서 419를 넘지 않는 가장 큰수는 256 이다. 

그 말인 즉. 419는 256개로 한번 묶을 수 있다는 것이다. 한번 묶었으니 256 자리에 1을 써준다.

419에서 256 를 한번 묶고 남은 나머지는 163. 2의 배수 중에서 요놈을 넘지 않는 가장 큰수는 128.

따라서 128로 한번 묶어준다. 당연히 128 자리에도 1을 써주고.


128로 묶고 남은 나머지는 35. 그런데 64는 35보다 크니까 묶을 수 없으므로 0.

32이로 한번 묶어주고 32 자리에 1.

나머지인 3.  16, 8, 4 는 묶을 수 없으므로 0.

2로 한번 묶고. 2자리에 1.

최종적으로 남은 나머지가 1.


256 128 64 32 16 8  4 2 1

 1    1    0  1   0  0 0 1 1


이런 식으로 결과가 나타나게 되는 것.



빼기 말고 눈대중의 간단한 예를 들자면 13.
2 / 13
      6  .... 1
      3  .....0
      1  .... 1
=> 1101(2)


보면 알 수 있듯이. 위에서부터 내려 읽는 것이 아니다.

2로 계속 나누는 것인데 몫을 밑에 쓰고 나머지를 우측에 쓴다.


나누어서 떨어지거나, 더 이상 나눌 수 없을 때까지.( 몫이 1이라면 더 이상 나눌 수 없다)

밑에서 부터 위로 읽어야 한다. 1 1 0 1



이걸 보여주는 이유는 고작 13 따위에 위에 처럼 일일이 계속 나누는 그런짓 하지 말자는 거다.


값이 13이라면 13을 넘지 않는 2배수의 가장 큰수는 8이다. 

그렇다면 8 4 2 1 이 4개로 더 해서 13 맞추고 그 숫자 자리에 1 넣으면 되지 않는가?


8 + 4 + 1 이면 13이 된다. 그러면 각 숫자의 자리에 1을 넣어주자.


8 + 4 + 1 = 1101(2)     적어도 4자리 15 밑으로는 그냥 대충 암산으로도 할 수 있다는 의미이다.


지금까지가 진법의 의미와 이진수 값으로 변환하는 방법들 이었다.


여기서 끝내지 말고 아래 링크를 통해 추가적으로 2진수와 8진수 그리고 16진수 의 관계와 변환 방법의 이해

왜 8진수와 16진수를 사용하는지 등에 대해서 알아보자. 



2진수와 8진수 그리고 16진수의 관계와 변환 방법