Skip to content

1. 보수(Complement)


1. 키워드

  • 보수(Complement)
  • 1의 보수(Ones' Complement)
  • 2의 보수(Two's Complement)
  • 비트 반전 연산자(~)


2. 보수(Complement)

1) 보수란?

  • 보수란 보충을 해주는 수를 말하며, 두 수의 합이 진법의 밑수가 되게 하는 수를 의미한다.
  • 예를 들어 8비트 이진수 0000 0100 1의 보수는 이진수 1111 1011이고, 이진수 0001 1010의 1의 보수는 이진수 1110 0101이 된다.


2) 1의 보수(Ones' Complement)

  • 1의 보수란 2의 거듭제곱수-1에서 빼서 얻은 이진수를 말하며, 비트를 반전시켜서 얻을 수 있다.


  • 다음의 예제는 1의 보수를 얻는 것을 보여주는 예제이다.


8비트 이진수 0000 1101 // 십진수 13

0 000 1101 // 부호 비트는 0 -> 양수


  • 1의 보수는 다음과 같이 해당 이진수와 자리수가 같고 모든 자리가 1인 수에서 해당 이진수를 빼서 얻을 수 있다.


  1111 1111
-) 0000 1101
------------
  1111 0010


  • 또한, 단순히 비트를 반전시켜서 얻을 수도 있다.


0000 1101 -> 1111 0010


  • 1의 부호를 구해 보면, 양수였던 부호 비트가 음수가 되는 것을 알 수 있다.


3) 2의 보수(Two's Complement)

  • 2의 보수란 2의 거듭제곱수에서 빼서 얻은 이진수를 말하며, 1의 보수에 1을 더하여 얻을 수 있다.
  • 일반적으로 부호를 바꿀 때 2의 보수 계산을 사용한다.


  • 다음의 예제는 2의 보수를 얻는 것을 보여주는 예제이다.


8비트 이진수 0000 1101 // 십진수 13

0 000 1101 // 부호 비트는 0 -> 양수


  • 2의 보수는 일반적으로 부호를 바꿀 때 사용한다고 했다.
  • 그러므로, 이진수 0000 1101에 그에 해당하는 음수를 더한다면 당연히 0이 되어야만 한다.


  • 다음의 예제는 이진수 0000 1101의 2의 보수를 더하여 0이 되는지 확인해 보는 예제이다.


// 1의 보수 계산
  1111 1111
-) 0000 1101
------------
  1111 0010

// 2의 보수 계산
  1111 0010
+) 0000 0001 // 1의 보수에 1을 더한 것이 2의 보수
------------
  1111 0011 // 이진수 0000 1101의 2의 보수

// 이진수 0000 1101과 2의 보수 1111 0011의 덧셈 연산
  0000 1101
+) 1111 0011
------------
 1 0000 0000
=) 0000 0000 // MSB 값인 1은 8비트를 넘어가므로 버림


  • 위의 예제에서 이진수 0000 1101에 2의 보수 1111 0011을 더했더니 0000 0000 즉, 0이 되는 것을 확인할 수 있다.
  • 결과적으로, 어떠한 수의 부호를 바꿀 때에는 2의 보수를 사용하면 된다는 것을 알 수 있다.


3. 비트 반전 연산자(~)와 보수

  • 십진수 x에 비트 반전 연산자(~)를 적용하는 것이 1의 보수를 구한 것과 같다고 한다.
  • 그리고 비트 반전 연산자를 적용한 결과는 항상 다음 예제와 같이 -(x+1)이 나오는데, 왜 이런 결과가 나오는지 알아보자.


int num1 = 13;
System.out.println(~num1); // -14

int num2 = -13;
System.out.println(~num2); // 12


  • 다음의 예제는 왜 위와 같은 결과가 나오는지 확인해 보는 예제이다.


// 1의 보수 계산
  1111 1111
-) 0000 1101
-----------
  1111 0010 // 부호 비트는 1 -> 음수


  • 십진수 13은 8비트 이진수 0000 1101이므로, ~(13) == ~(00001101)이라고 할 수 있다.
  • 그리고 비트 반전 연산자의 적용은 1의 보수 계산과 같으므로 이진수 0000 1101에 1의 보수를 계산하면 된다.
  • 그 결과, 이진수 0000 1101의 1의 보수는 이진수 1111 0010가 되며, 음수가 된다는 사실은 이제 잘 알 수 있다.
  • 이제 이 음수인 이진수 1111 0010은 십진수로 몇인지 확인해 보면 되는데, 이 자체로는 해당하는 십진수를 알 수 없기 때문에 양수로 다시 바꿔 줘야 한다.


  • 음수인 이진수 1111 0010을 다음과 같이 2의 보수 계산을 통해 단순히 다시 양수로만 바꿔 보자.


8비트 이진수 1111 0010

// 1의 보수 계산
  1111 1111
-) 1111 0010
------------
  0000 1101 // 십진수 13

// 2의 보수 계산
  0000 1101
+) 0000 0001
------------
  0000 1110 // 십진수 14


  • 위의 예제에서 음수인 이진수 1111 0010을 2의 보수 계산을 통해 양수로 바꿔 줬더니 십진수 14가 된다는 것을 확인할 수 있다.
  • 즉, 음수인 이진수 1111 0010의 부호만 바꾼 상태이기 때문에 음수인 이진수 1111 0010은 음수인 십진수 14와 동일하다고 볼 수 있으며, 이것은 ~(13) == ~(00001101) == 11110010 == -(14)이라는 의미가 된다.