본문 바로가기
컴퓨터공학/디지털공학개론

3. 10진수, 2진수, 8진수, 16진수의 개념과 변환

by meow0110 2024. 6. 12.

■ 10진수

- 10진수 시스템에서 0~9까지의 10개의 숫자로 표현 (1자리를 기준)

- 10n(n=±정수)

 

■ 기수는 10 : 가중치를 보면 알 수 있다. 

10^0승은 1이기 때문에 1자리이다.

10^1승은 10이기에 2자리이다

10^2승은 100이기 때문에 3자리이다.

 

10^-1승은 0.1 이다. 즉 소수

10^-2승은 0.01이다. 이것도 소수

 

■ 각 자릿수를 갖는 값의 합 = 가중치 구조로 표현해라 라는 뜻.

 

 

 

 

■ 2진수

- 2진수 시스템에서 0과1의 2개의 숫자로 표현

-디지털시스템에서는 2진수 사용

- 2n(n=±정수)

 

■ 덧붙임

2^-1승은 1/2이다.

2^-2승은 1/4이다. 계속해서 증가하는 n은 1/8, 1/16, 1/32, 1/64, 1/128로 늘어난다.

 

■ 10110.11011 (2진수)를 10진수로 바꾸어라 (위의 10110.11011 항)

10110.11011 에서 각자리 0 은 사라진다. 0을 곱하면 0이니까.

여기서 정수와 소수를 분리해보자 10110 과 11011로 나눈다!

10110 = 16 + 4+ 2가 된다. 그래서 22

소수 뒷자리 .11011 은 0.25 + 0.0625 + 0.03125 이다. 더하면 0.84375이다.

 

 

■ 4비트의 경우 2^4 = 16이다. -1 하면 15

■ 8비트의 경우 2^8 = 256이다. -1 하면 255

■ 왜 -1을 하는가? 컴퓨터의 숫자는 1이 아닌 0부터 시작하기 떄문이다. 즉 0~15 = 총16개이다.  마찬가지로 0~255 는 총갯수가 256개가 맞다. 다만 우리가 생각하는 가장 큰수는 거기서 항상 -1인 숫자가 되기 때문에 -1을 하는 것이다.

 

■ 참고자료

-2,8,10,16진수가 뭐인가?

- 위 표의 10진수 항목을 기준으로 보자. 아래에 설명함

 

0-1은 2개의 숫자다. 이 2개로만 표현한 걸 2진수라고 한다.

0-7까지 총 8개로 표현하는 것을 8진수라고 한다.  비트로 표현하자면 000~111까지이다. 그래서 총 3개의 비트만 쓴다.

0-9까지 총 10개로 표현하는 것을 10진수라고 한다.

0-15까지 총 16개로 표현하면 16진수라고 하는 것이다. 비트로 표현하면 0000~1111까지이다. 그래서 총 4개의 비트를 쓴다. 

 

 

■ 위의 그림은 계수기 (카운터)이다.

■ 카운터 갯수 어떻게 읽나?

1개면 01 이다.

2개면 10

3개면 11

4개는 100

5개는 101

6개는 110

7개는 111

8개는 1000

9개는 1001 이다.  여기서 앞 1은 MSB / 뒷자리 1은 LSB 이다.

 

 

■ 누승= 제곱승

 

 

■ 12가 어떻게 1100 이 되는가?

  2^4 2^3 2^2 2^1 2^0
10진수로 표현 16 8 4 2 1
필요한가? x 필요 필요 x x
필요하니까 불들어와! 0 1 1 0 0

 

일단 2진수 숫자들 중에서 12를 만들 수 있는 조합이 뭔가?

8과 4를 더하면 12이네? 

즉 2^3승과 2^2승을 더하면 8+4니까 12이다.

즉, 우리가 쓸 2^3승과 2^2승에만 불이 들어온다. 1을 On이라고 생각해보자. 불들어와!

그러면 01100이다. 앞에 0은 필요없으니 1100 이다.

 

 

■ 25는 어떻게 11001이 되는가?

  2^4 2^3 2^2 2^1 2^0
10진수로 표현 16 8 4 2 1
필요한가? 필요 필요 x x 필요
필요하니까 불들어와! 1 1 0 0 1

16+ 8+ 1은 25이다.

필요한 것들 불 들어와!

11001 이 된다.

 

 

■ 58은 어떻게 111010이 되는가? 

  2^5 2^4 2^3 2^2 2^1 2^0
10진수로 표현 32 16 8 4 2 1
필요한가? 필요 필요 필요 x 필요 x
필요하니까 불들어와! 1 1 1 0 1 0

 

 

 

 

■ 고전적으로 나눠서 해보자

이렇게 나눈다. 그리고 마지막 몫과 나머지들을 보면 10011 이 된다. 이게 그 값이다.

 

■ 위에서 배운 방식

  2^4 2^3 2^2 2^1 2^0
10진수로 표현 16 8 4 2 1
필요한가? 필요 x x 필요 필요
필요하니까 불들어와! 1 0 0 1 1

16 + 2+1 = 19니까.  10011이 된다.

이 방법을 좀 더 권장한다고 함. 

 

 

 

■ 2가지 방법이 있다.

- 위에서 배운 가중치의 합 방법

- 계속 2를 곱하는 방법

 

■ 계속 2를 곱하는 방법

- 앞의 진한 검은색 0 의 자리를 그대로 빨간색 0이 되어 옮긴다. 

- 만약 나온 빨간 수가 1이라면? 그다음 줄에서 1을 빼야한다. 

- 예를 들면 0.625에서 2를 곱하면 1.25가 나온다. 그리고 우린 빨간색 1에서 1로 표기한다. 그러면서 다음에 곱할 숫자에 1을 빼는 것이다. 그렇게 빼면? 1.25x2가 아닌, 0.25가 되는 것이다.

- 언제까지하는가? 마지막 소숫점 수가 0이 될때까지.  즉 0.x 에서 x가 0이 될때까지한다.

 

.

  시작 수 곱하기 2 결과는? 앞자리 수가 뭔가? 저장할 값
(2진수 표시때 쓸 값)
특이사항
1단계 0.3125 2 0.625 0.xxx 0 (앞자리를 그대로) 결과값 0.625 그대로 써
2단계 0.625 2 1.25 1.xx 1 앞이 1이야! 1을 빼!
3단계 0.25
(결과가 1.25인데 왜 0.25인가? 1로 해당 값을 나타내기 위해 뺀 것이라 생각하자!)
2 0.5 0.x 0 결과값 0.5 그대로 써
4단계 0.5 2 1.0 1.0 1 일단 앞자리가 1이니까 1을 빼! 

소수 뒷자리 0.x에서 x가 0이네? 끝내!

■ 계속 2를 곱하는 방법 (정리해본 내용)

- 아래의 표는 내가 정리한 것이다.

- 의식의 흐름처럼,  좌 > 우 에서 시작해서 아래로 내려가면서 흐름을 보면 된다

- 저장할 값에서 0101 순서대로해서  [  .0101 ] 이라고 보면 된다. 

 

 

■ 보수의 개념 : 

- 컴퓨터는 덧셈을 좋아한다. 반대로 뺄셈, 곱셈, 나눗셈을 싫어한다. 그래서 이러한 3가지 싫어하는 산술을 덧셈으로 만든 것이 보수의 개념이라 생각해보자.

- 보수라는 것은 음수의 개념을 양수로 바꾸는 것이다. 

 

■ 캐리 : 2진수에서는 1+1은 2가 아니다. 1+1은 0이 되고 한자릿수가 올라간다. 그래서 10이다.

 

■ 2번째 줄을 잘 보자

0에서 1을 뺄 수 없으니 앞의 빨간색 1의 자리를 빌린다.

10-1 에서 10은 2라고 생각하면 된다.  0은 0 / 1은 1 / 10은 2이다. (2진수표를 보면 된다.)

그래서 1이 된다. 그런데 우리가 앞서 빌린 1이 있다. 빨간색 1. 그걸 빌린 티를 내야한다.

그래서 11이 되는 것이다. 

 

■ 예제 c문제

일의 자리 : 0-1은 안된다. 그래서 앞 십의자리(편의상 110 빨간색십의 자리라고 함)에서 빌려온다. 10-1 = 1이다

십의 자리 : 앞서 1을 빌려왔다. 그래서 0이다. 이것도 앞의 백의 자리에서 1을 빌려온다. 그러면 10-1이므로 1이다.

백의 자리 : 앞서 십의 자리에서 1을 가져왔다. 그래서 0이다. 0-0은 0이다.

결론 :  011 이므로 11이다.

 

■ 예제 a

    1 1 11x1 아래 11 중에 일의 자리 1
+ 1 1 0 11x10 아래 11중에 십의 자리 10
---- ---- ----- -----    
1 0 0 1    

 

■예제 b

      1 1 1 111x1  111이다.
            111x0  0 이다.
+ 1 1 1 0 0 111x100 11100
------- ------ ------ ------ ------ ------    
1 0 0 0 1 1    

■ 결론

2번째 줄을 각각 나눠서 1번째 수와 처리한다. 그리고 합산한다.

다만 합산시에는 반드시 2진수로 처리하는 것을 잊지말자.  1+1 =은 10이다.

 

 

■ 그냥 나눗셈 그대로 하면 된다.

■ 맨 위가 결과값이다.

 

■ 보수의 개념. 매우 중요! 반드시 숙지해둘 것.

■ 2진수의 보수는 2가지가 있다.

 

■1의 보수

1은 0 ,   0은 1로  바꾸기만 하면 된다.

위의 세모 모양은 Not게이트이다.

 

■ 1의 보수 특징

1의 보수는 모두 더하면 1이다. 무슨 뜻인가? 아래 표를 보면 된다.

기본값   1 1 0 0 1 0 1 0
1의 보수 변환   0 0 1 1 0 1 0 1
  + ------------- ------------- ------------- ------------- ------------- ------------- ------------- -------------
다 더하니 1이네?   1 1 1 1 1 1 1 1

 

 

 

 

■ 2의 보수

기본값   1 1 0 0 1 0 1 0
                   
1의 보수 치환
(1`s complement)
  0 0 1 1 0 1 0 1
1을 더한다! +               1
    ------------- ------------- ------------- ------------- ------------- ------------- ------------- -------------
결과값
(2`s complement)
  0 0 1 1 0 1 1 0

1`s complement 는 1의 보수로 치환함

2`s complement 는 치환한 값에 1을 더한 값

이것이 2의 보수이다.

 

■ 2의 보수 특징

기본값   1 1 0 0 1 0 1 0
2의 보수 결과값   0 0 1 1 0 1 1 0
  + ------------- ------------- ------------- ------------- ------------- ------------- ------------- -------------
    0 0 0 0 0 0 0 0

2의 보수는 기본값에 결과값을 더하면 1의 보수와 다르게 0000000 이 된다.

즉, 1의 보수는 기본값에 1의보수 결과값을 더하면 1이 되지만, 2의 보수는 0 이 된다.

 

 

■ 2의 보수 구하는 다른 방법 (훨씬 쉽다!)

왼쪽으로 가면서 나타나는 첫 1까지는 그대로 쓴다. 즉 위의 예제에서 빨간색 부분이다.

그리고 나머지 부분은 반대로 바꾼다. 노란색 부분이다.

 

예제 그림

1의 보수 부분은 그대로 이다.

캐리 입력 부분에서 1을 더한다. 우리가 아는 2의 보수 구할 때 쓰는 +1이다.

 

 

 

■ 16진수

-기수는16

-16개( 0~9,A~F )의 문자로 구성

- 2진수와 상호 변환이 쉬움

-왜 2진수와 상호 변환이 쉬울까? 2진수가 4비트를 최대로 쓸 때 0000~1111이다. 그리고 16진수에서 쓰는 최대가 4비트이기 때문. 그래서  4비트씩 딱 맞아떨이지기 때문에 상호변환이 좋은 것이다. 

 

■ 2진수를 16진수로 변환해라

4비트씩 끊으면 된다. 그리고 그 끊은 것을 각각 변환하면 된다.

왜냐하면 2진수로 16진수를 만들려면 4비트가 필요하니까.

 

■ 예제 b

앞에 2자리밖에 안남을 때는 00이 생략되어 있다고 생각하면 된다. 즉 0011 = 11 이다. 그래서 3이다.

 

■ 16진수를 2진수로 바꿀때

16진수 각 숫자를 4비트씩 표현하면 된다. (반대)

 

■ 16진수를 10진수로

 

■예제 윗부분 (이 방법을 추천한다. 단계는 한번더 거치지만, 헷갈리지 않는다.)

예제 a)  1C  문제를 예를 들어 보자.

- 먼저 16진수를 2진수로 바꾼다.

- 1C는 0001 1100 이 된다.

- 그다음 각 자릿수를 더하면 된다. 무슨 말인가?

- 여기서 1로 되어 있는 부분이 몇승인지 보자.

0 0 0 1 1 1 0 0
2^8 2^7 2^6 2^5 2^4 2^3 2^1 2^0
128 64 32 16 8 4 2 1
      쓴다 쓴다 쓴다    

즉 위에 1이 들어온 부분은  16, 8, 4이다. 이걸 더해주면 된다.

16+8+4는 28이다. 

 

 

■예제 아랫부분

E5는 2자리이다. 즉 16^0 와   16^1 으로 나눠 계산하면 된다.

B2F8의 계산에서 4096은 16^3이다. 256은 16^2, 16은 16^1

 

 

■10진수 16진수 (16으로 반복적으로 나눈다.)

- 빨간 40은 다음에 나눌 때 쓴다. 나머지 0.625에 16을 곱한다. 10이 나온다. 이 16진수에 10은 A와 같다. (10이 왜 A인지 모르겠으면 16진수와 10진수 비교표를 보면 된다.) 

- 빨간 2는 다음에 나눌 때 쓴다. 나머지 0.5에 16을 곱한다. 8은 그대로 8

- 여기서 앞 수가 0.xxx가 된다. 0이 되므로 그만 나눈다. 그리고 0.125에 16을 곱한다. 결과값 2는 그대로 2이다.

 

결과값  28A가 나온다.

 

 

 

■ a,b,c 예제에서는 그냥 더하면 된다.

 

■ d번을 유의깊게 보자. (합이 16진수 최대를 넘어가는 경우임. 10진수로 예를 들면 9+9 이런식의 올림이 나온 경우이다.)

- F와 C를 더하면 16진수 최대 숫자 크기가 넘어간다. (F가 최대표현숫자임)

- 즉, 15+12가 된다. 그리고 결과값은 27이다. 27은 16진수로 표현이 안된다.

- 그래서 27-16을 해준다. 그러면 나머지 몫 11이 남는다. 11은 B이다. (16진수에서)

 

- D+A를 한다. 마찬가지로 13+10은 16진수 최대를 넘어감. 거기에 위에서 올림 수 +1이 있기에 총 24임

- 24에서 16을 뺀다. 그러면 8이다. 8은 8 그대로 쓸 수 있다.

 

- 위에서 1자리를 올렸기에 올림수 1이 붙는다.

-결과적으로 18B가 된다.

 

 

 

16진수 뺄셈

 

  2a 예제

- 먼저 빼야할 수 2A를 2의 보수로 계산해야한다. 그렇기 위해서 2진수로 일단 표현하자.

00101010이다.  여기서 오른쪽 기준 첫 1까지는 놔둔다. (빨간 부분)

- 위의 나머지 밑줄친 부분은 반대로 바꾼다.

- 결과값은 11010110  이다.  이를 다시 16진수로 바꾸면 D6이다.

 

-이제 2의 보수로 바꾸었으니 그대로 더하면 된다. (왜 위에서 2의 보수로 바꾸었나? 컴퓨터는 덧셈을 좋아하지 뺄셈을 싫어한다. 즉, 2의 보수로 바꾼이유는 84-2A라는 연산이 너무 싫기에 덧셈형식으로 만들어주는 것이다. 즉 84+D6 이라는 덧셈형식으로 만들어서, 컴퓨터는 자기가 좋아하는 연산방식으로 바꿔서 하는 것이라 보면 된다.)

- 84+D6을 계산한다.

- 4과 6는 더하면 A

- 8과 D(13)을 더하면 21이다. 16진수에서 표현 못한다. 올림하자

-올림하는 방법: 21-16을 하면 된다. 나머지 값 5이다. 그리고 올림한 1이 남아있다.

- 그래서 15가 되는 것이다.

-결론 15A가 된다.

 

 

■ 8진수는 3개의 비트를 사용한다. 그래서 3비트로 쪼개주면 된다.

 

 

■ 예제 위

a)

- 13을 1과 3으로 쪼갠다

- 각각, 001 011으로 나타낼 수 있다. 끝이다.

 

 

■ 예제 아래

a) 답 65

- 110, 101로 나눠서 본다.

- 110은 6이다.

- 101은 5이다.

 

b) 571 

c) 4632

d) 3204

 

■문제1

다음 중 8비트 2진수 00111100 (2진수)+11001100 (2진수)의 결과로 옳은 것은?

 

원래대로라면 264가 나온다. 그러나 이는 9비트까지 사용하게 되는 것이다. 

즉 문제에서는 8비트까지 나와있다. 9비트는 캐리가 된 것으로 버려지게 된다.

앞 1은 버려지므로, 00001000은 8이다. 그래서 정답은 8이다.

 

 

■문제2

10진수 정수 부분을 2진수, 8진수, 16진수 등으로 변환할 때 2, 8, 16 등으로 나눠 몫과 나머지를 계산하고, 몫이 1이 될 때까지 계산한다.  는 맞는 말인가?

 

X 틀렸다. 왜냐하면 나눈 몫과 나머지로 계산하지만, 몫은 0이 될 때까지 계속하고 몫이 0이 되면 나머지를 계산된 순서와 반대로 하면 원하는 진수로 변환된다.

 

 

 

■ 학습정리

1. 10진수, 2진수, 8진수, 16진수

  • 사람은 10진수를 사용하지만 컴퓨터 내부에서는 데이터를 쉽게 표현하기 위해 2진수를 사용
  • 컴퓨터 내부에서는 2진수로 나타내지만 보기에 적합하지 않으므로 8진수나 16진수로 변환하여 나타냄
  • 2진수를 8진수로 바꿀 때는 3자리씩 끊어서 변환하고, 16진수로 바꿀때는 4자리씩 끊어서 변환

2. 10진수 정수 부분을 2진수, 8진수, 16진수 등으로 변환

  • 2,8,16등으로 나눠 몫과 나머지를 계산하며, 몫이 0이 될 때까지 계속
  • 몫이 0이 되면 나머지를 계산된 순서와 반대로 적으면 원하는 진수로 변환

3. 10진수 소수 부분을 2진수, 8진수, 16진수 등으로 변환

  • 2,8,6 등을 곱하여 소수 이하 자리가 0이 될 때까지 계속
  • 소수 이하 자리가 무한히 반복되는 경우 적당한 선에서 계산을 그만두고, 곱셈 결과 정수가 되는 부분을 순서대로 원하는 진수로 변환