1의 보수

IT 위키
One's Complement
이진수의 모든 비트를 반전시켜 얻는 보수. n비트 수 N 에 대해 (2ⁿ − 1) − N 과 같다.

컴퓨터가 뺄셈을 별도의 회로 없이 덧셈기만으로 처리하기 위해 쓰는 음수 표현 방식 중 하나다.

구하는 법

[편집 | 원본 편집]

비트를 그대로 뒤집으면 된다. 0은 1로, 1은 0으로 바꾼다.

  원래 값 : 0 0 1 0 1 1 0 0   (44)
1의 보수 : 1 1 0 1 0 0 1 1

뺄셈에 쓰는 법

[편집 | 원본 편집]

A − BA + (B의 1의 보수) 로 계산한다. 이때 맨 앞에서 올림(carry)이 발생하면 그 올림을 결과의 최하위 비트에 다시 더한다. 이를 순환 자리올림(end-around carry)이라 한다.

   11110100   (−11)
 + 00100000   (+32 … 11011111 의 1의 보수)
 -----------
 1 00010100   ← 최상위에서 올림 발생
   00010100
 +        1   ← 순환 자리올림
 -----------
   00010101   (+21)

미지수를 구하는 경우

[편집 | 원본 편집]

X + Y = Z 에서 Y 를 구하려면 Y = Z − X = Z + (X의 1의 보수) 로 계산한다.

 X = 11110100, Z = 11011111 일 때

   11011111   (Z)
 + 00001011   (X 의 1의 보수)
 -----------
   11101010   ← 올림이 없으므로 그대로 답

 Y = 11101010

검산하면 11110100 은 −11, 11011111 은 −32 이므로 Y = −32 − (−11) = −21 이고, 21(00010101)의 1의 보수가 11101010 이므로 값이 맞는다.

음수 표현으로서의 성질

[편집 | 원본 편집]
  • 최상위 비트가 부호 비트다. 0이면 양수, 1이면 음수.
  • 0이 두 가지로 표현된다. 8비트에서 00000000(+0)과 11111111(−0)이 모두 0이다. 이것이 1의 보수의 가장 큰 단점이다.
  • n비트로 나타낼 수 있는 범위는 −(2ⁿ⁻¹ − 1) ~ +(2ⁿ⁻¹ − 1) 이다. 8비트면 −127 ~ +127.

2의 보수와의 비교

[편집 | 원본 편집]
1의 보수 2의 보수
구하는 법 모든 비트 반전 모든 비트 반전 후 1을 더함
0의 표현 +0, −0 두 가지 하나뿐
8비트 표현 범위 −127 ~ +127 −128 ~ +127
뺄셈 시 처리 순환 자리올림이 필요 올림을 버리면 된다
실제 사용 초기 컴퓨터, 체크섬 계산 등 현대 컴퓨터의 표준

TCP·UDP·IP 헤더의 체크섬은 지금도 1의 보수 합을 다시 1의 보수 취하는 방식으로 계산한다.

같이 보기

[편집 | 원본 편집]