[C/C++] 진법과 비트

HwangBBang·2023년 1월 12일
0
post-thumbnail

진법 (base)

보수와 비트 개념을 배우기 전에 알아두면 이해하는데 많은 도움이되는 것에 대해 이야기해보려한다.

진법이란?

한 자리를 표현할 때 그 자리가 어떤 수가 들어갈 수 있는지 정하는 것이다.
이렇게 이야기하면 이해하기 어려울 수 있으니 예시를 들면서 이어나가겠다. 우리는 10진법의 세계의 살아가고있다. 이것을 의심하는 사람은 아마 없을 것이다.

너무나도 친숙한 10진법은 어떻게 정의되어있을까?
설명에 앞서, 지금부터 한자리 숫자까지 밖에 배우지못한 어린아이와
모든 숫자를 통달한 아이가 있다고 하자.

두 아이가 숫자 10 을 읽는 과정을 살펴 보자. 숫자를 통달한 아이는, 숫자 10 이것을 숫자 "십" 이라고 부른다. 하지만 한자리 밖에 모르는 아이라면? 1과 0으로 이뤄져있는 수라고 이야기 할것이다. 반대로 숫자 9 는 두 아이모두 숫자 "구"라고 읽을 것 이다.

이렇듯 10진 세계는 한 자리를 이루는 숫자의 가짓수가 10개(0~9)이다.
그럼 2진 법(세계)는 어떨까? 2진 세계는 한 자리를 이루는 숫자의 가짓수가 2개(0~1)이다.
이제 귀납적으로 접근해보자. n진 법(세계) 는 한 자리를 이루는 숫자의 가짓수가 n개(0 ~ n-1)이다.
(증명은 생략한다.)

이제 진법 개념을 숙지했다. 보수로 넘어가보자

보수(Compliment)

0과1로 이루어진 컴퓨터 세계에서 마이너스(-) 부호는 어떻게 나타내고 그럼 컴퓨터의 뺄셈을 어떻게 실행할까?
이 궁금증을 해결하기위해

보수의 세계에는 2가지 보수가 있다.

  • n의 보수
  • (n-1)의 보수

    예시)
    2진수라면 -> 2의보수,1의 보수
    10진수라면 -> 10의 보수, 9의 보수

n-1의 보수 정의

  • (n-1)의 보수 는 해당 수를 뒤집은 수이다.

n-1의 보수를 구하는 과정을 살펴 보자.

2진세계(법)으로 표현된 10 이 있다고 하자.
2진 세계에서 n-1 ,즉 1의 보수 10 -> 01 이므로

Ones Complements of the 102012.One's \ Complements \ of \ the \ 10_2 \Rightarrow 01_2.

10의 1의 보수는 01임을 알 수 있다.

다음은 10진 세계를 관찰해보자. 10진 세계에 74가 있다고 하자.
10진 세계에서는 n-1은 9의 보수이고 74-> 25 이므로

Nines Complements of the 7425.Nine's \ Complements \ of \ the \ 74 \Rightarrow 25.

n의 보수 정의

n의 보수를 구하는 과정은 n-1 의 보수에 1을 더한값이다.

2진 세계 1의 보수 01 에 1을 더한다. -> 10

Ones Complements of the 102012One's \ Complements \ of \ the \ 10_2 \Rightarrow 01_2
012+110201_2 + 1 \Rightarrow 10_2
So, Twos Complements of the 102=102So,\ Two's \ Complements \ of \ the \ 10_2 = 10_2

10진 세계 9의 보수 25 에 1을 더한다.-> 26

Nines Complements of the 74=25Nine's \ Complements \ of \ the \ 74 = 25
25+12625 + 1 \Rightarrow 26

보수로 뺄셈하기

  1. (더하거나 빼려는 녀석을) n의 보수로 바꾼 뒤 더해준다.
  2. 원래 수의 최대 자릿수를 넘어간 가장 큰 자릿수를 버린다.
  3. 보수를 더했을 때 자리올림이 발생하지 않는 경우, 결과값은 무조건 음수다
  4. 버리지않았을경우 (음수일경우) 다시 n의 보수를 취해주면 정답을 낼 수 있다.

10진 세계에서 54 - 34를 보수 뺄셈으로 계산 과정은 다음과 같다.

  1. 34를 10의 보수로 변환 => 66
  2. 변환한 수를 더한다: 54 + 66 = 120
  3. 초과한 자릿수를 버린다: 120 -> 20
  4. 초과한 자릿수 값 1이 양수임을 의미한다.
  5. 이때 이값이 0이라면 음수임을 의미하고 다시 한번 10 의 보수화를 시킨다.

2진 세계에서 1101 - 0111 을 보수 뺄셈으로 계산 과정은 다음과 같다.

  1. 0111을 2진 보수로 변환 =>1001
  2. 변환한 수를 더한다. 1101 + 1001 => 10110
  3. 가장 큰 자릿수를 버린다. => 0110

검산 해보면 1101(13)- 0111(7) = 0110(6) 정답임을 알 수 있다.


오류나 질문에 대한 문의 댓글로 남겨주겨주세요!

profile
https://hwangbbang.tistory.com/

0개의 댓글