[C++] Bitwise not 연산

Artiper
|2025. 2. 11. 00:43

Bitwise not 연산

Bitwise not 연산자는 '~'를 사용한다. 이는 모든 비트를 flip 시킨다. 또한 이진 연산 중에서 가장 우선 순위가 높다.

 

예를 들어, int 타입의 값 20에 not 연산자를 사용하면 다음과 같다.

int main()
{
	int num = 20;
	cout << ~num << '\n'; // 출력: -21
	return 0;
}

 

왜 -21이 출력될까?

int 타입의 20에 not 연산자 사용하면 MSB도 반전되어 부호가 변경되며, int 타입은 2의 보수로 값을 표현한다.

  • 00000000 00000000 00000000 00010100 : 20
  • 11111111 11111111 11111111 11101011 : -21

예를 들어, 1의 보수를 따랐다면 비트 "11111111 11111111 11111111 11101011"은 -20을 의미했을 것이다. 그러나, 해당 비트를 2의 보수체계를 따라 해석하므로 -21이 된다.

 

조금 더 자세히 설명하자면, 2의 보수를 구하는 방법은 1의 보수를 구한 뒤 1을 더하는 것이다.

  • 2의 보수 = 1의 보수 + 1
  • 그래서 숫자 20의 1의 보수를 구하면 11111111 11111111 11111111 11101011이 되고, 2의 보수를 구하기 위해 1을 더하면 11111111 11111111 11111111 11101100이 된다.
  • 즉, 2의 보수 체계에서는 사실 -20은 " 11111111 11111111 11111111 11101100"으로 표현된다.
  • 그런데, not연산자는 정말 0과 1을 flip하기만 하는 연산이니, 비트를 플립하여 나타난 11111111 11111111 11111111 11101011을 2의 보수 체계로 해석하면 -21이 되는 것이다.

 

그래서 사실 int 연산자에 비트 not연산자를 취한 값은 $ \sim x = -(x + 1) $ 으로 생각하면 된다.

 

다른 예시

2의 보수를 따르는 것을 가정한다. 다음은 이진수와 십진수를 나타낸 값이다.

  • [1111 0001 = -15]  [0000 11111 =15]
  • [1111 0000 = -16]  [0001 0000 = 16]

int형 변수 15에 ~ 연산을 취했을 때 다음과 같은 절차를 따른다.

  • $\sim (0000 1111) = 1111 0000$
  • $~(15) = -16$
  • $\sim (x) = -(x + 1) $

이를 통해 int형 타입의 십진수에 ~연산을 취하면 다음과 같은 식을 따라 계산하면 된다.

  • 양수 → 음수 : $\sim (x) = -(x + 1) $
  • 음수 → 양수 : $\sim (-x) = (x - 1) $

 

 

참고 자료