따배씨++ (3.7 Binary Numbers)

김동우·2021년 4월 14일
0

안녕하십니까. 김동우입니다.

오늘 노트는 코드보다 글귀로 작성하게 되었으니, 양해 부탁드립니다.

그럼 시작하겠습니다.

  1. 10진수

0-9 범위 이후 나오는 10, 11, 12의 경우 다음과 같다.
10 = 10^1 + 0 = 10^1 X 1 + 10^0 X 0
11 = 10^1 + 1 = 10^1 X 1 + 10^0 X 1
12 = 10^1 + 2 = 10^1 X 1 + 10^0 X 2
...
336 = 300 + 30 + 6 = 10^2 X 3 + 10^2 X 3 + 10 ^0 X 7

이와 같이 표현하는 수를 우리는 10진수라고 부릅니다.

  1. 2진수

0-1 이후의 수는 자리수를 늘려 카운트합니다.
0 = 0
1 = 2^0
10 = 2^1 X 1 + 2^0 X 0 = 2
11 = 2^1 X 1 + 2^0 X 1 = 3

2진수의 덧셈의 경우 다음과 같습니다.

10 + 11 + 01 = 110

법칙을 좀 아시겠나요? 먼저, 10 + 11 의 경우 101이 됩니다.

이는 10진수의 받아올림과 같은 방식입니다.

이후 101 + 01의 경우에는 101 + 001 로 생각하시면 편하게 계산할 수 있습니다.

마찬가지로 받아올림을 통해 110으로 표현해주시면 됩니다.

사실 수식에서 2진수는 (2)와 같은 표시를 수의 오른편 하단에 해주어야 하지만, 편의를 위해 본 노트에서는 생략하도록 하겠습니다.

  1. 변환 (binary to decimal)

7654 3210 (제곱수)
0101 1110
2^7 X 0 + 2^6 X 1 + 2^5 X 0 + 2^4 X 1 + 2^3 X 1 + 2^2 X 1 + 2^1 X 1 + 2^0 X 0
= 128 X 0 + 64 X 1 + 32 X 0 + 16 X 1 + 8 X 1 + 4 X 1 + 2 X 1 + 1 X 0
= 64+16+8+4+2
= 94

상당히 번거롭고 귀찮은 과정이죠? 심지어 가독성도 상당히 떨어집니다.

2진수를 10진수로 바꾸는 과정은 생각보다 귀찮고, 2의 제곱수들을 외워야하는 단점이 있습니다.

컴퓨터에게 새삼 감사한 순간이네요.

  1. 변환 (decimal to binary)

148
148 / 2 = 74 r0 (r = remainder)
74 / 2 = 37 r0
37 / 2 = 18 r1
18 / 2 = 9 r0
9 / 2 = 4 r1
4 / 2 = 2 r0
2 / 2 = 1 r0
1 / 2 = 0 r1

148 = 1001 0100

자, 뭔가 보이시나요? 네, 맞습니다.

맨 아래 나머지부터 맨 위 나머지까지 차례로 나열하면 10진수를 2진수로 변환하는 과정이 끝납니다.

다른 방법으로는

1 2 4 8 16 32 64 128 256 512 1024 ...

148
148 >= 128 -> 128=2^7, 8번째 자리가 1
148 - 128 = 20 -> 20 >= 64 -> 64=2^6, 7번째 자리가 0
...

이러한 식으로 변환할수도 있습니다.

  1. 보수(=complement) (8bit binary)

8765 4321 (bit num)
0000 0101 (decimal = 5)
1111 1010 + 1 -> 1을 1bit 자리에 더해줍니다.
1111 1011 (decimal = -5)

단, 위의 8번째 bit는 부호를 나타내는데 사용하게 됩니다. 그렇기에 1byte signed char의 표현 범위는 -128~127가 됩니다.

1을 더해주는 이유는 negative zero로 증명할 수 있습니다.

0000 0000 (decimal 0)
1111 1111 + 1
0000 0000

위와 같이 오셀로와 같은 현상이 발생합니다 (= 교수님 말씀)

  1. signed, unsigned

signed(1001 1110) = -98 -> 위에서 말했듯 범위는 -128 ~ 127이 됩니다.
unsigned(1001 1110) = 158 -> 부호개념이 없기 때문에 0 ~ 255 까지 표현합니다.

  1. 연습문제
  • 0100 1101 -> 77 (unsigned)
  • 93 -> 0101 1101 (unsigned)
  • -93 -> 1010 0011 (signed)
  • 1010 0010 -> 162 (unsigned)
  • 1010 0010 -> -94 (signed)

그럼 이번 글은 여기서 마치도록 하겠습니다. 감사합니다.

0개의 댓글

관련 채용 정보