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) $
참고 자료
'C,C++' 카테고리의 다른 글
[C++] 상수와 포인터 (0) | 2023.01.24 |
---|---|
C언어 string.h 문자열 관련 함수 정리 (0) | 2021.01.09 |
C언어 표준함수 확인 (0) | 2021.01.09 |
[C언어] 배열을 초과해서 데이터 삽입 (0) | 2021.01.07 |
함수 내부에 크기가 너무 큰 배열 선언 시 메모리 초과 (0) | 2020.08.20 |