문제1516--[기초-비트단위논리연산][C] NOT문지기

1516: [기초-비트단위논리연산][C] NOT문지기

[만든사람 : 2023 박정호,박혜미,백승관,안득하,유현호,이경미,이민혁,임건웅,임수빈,임의정,임태현,한진우,황윤정]
시간제한 : 1.000 sec  메모리제한 : 128 MiB

문제 설명

 금쪽이는 비트나라에서 여행을 하는 꿈을 꾸었다. 이 비트나라에서는 수를 이진수로 표현하고, 수를 계산하거나 조작할 때 비트단위로 한다. 이러한 상황에서 금쪽이는 왕국 성문을 지키는 NOT문지기를 마주쳤다. NOT문지기는 자신이 말하는 정수를 비트단위로 참/거짓을 바꾸고 난 후 나온 정수를 십진수로 말해줘야 통과시켜준다고 한다.(단, 정수는 int형으로 32비트를 기준으로 한다.)
 예를 들어  숫자 2를 말했다면, 2는 이진수로 000000 000000 000000 000010이고 참/거짓을 바꾸면 111111 111111 111111 111101로 -3이 된다.

입력 설명

정수 n이 입력된다.
(-2147483648 <= n <= +2147483647)

출력 설명

비트 단위로 1 -> 0, 0 -> 1로 바꾼 후 그 값을 10진수로 출력한다.

입력 예시 Copy

2

출력 예시 Copy

-3

도움

비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)
컴퓨터에 저장되는 모든 데이터들은 2진수 형태로 바뀌어 저장된다.
0과 1로만 구성되는 비트단위들로 변환되어 저장되는데,
양의 정수는 2진수 형태로 바뀌어 저장되고,
음의 정수는 "2의 보수 표현"방법으로 저장된다.
예를 들어 int형(4바이트(byte), 32비트)으로 선언된 변수에 양의 정수 5를 저장하면
5의 2진수 형태인 101이 32비트로 만들어져
00000000 00000000 00000000 00000101
로 저장된다.(공백은 보기 편하도록 임의로 분리)

int 형의 정수 0은
00000000 00000000 00000000 00000000

그리고 -1은 0에서 1을 더 빼고 32비트만 표시하는 형태로
11111111 11111111 11111111 11111111 로 저장된다.

-2는 -1에서 1을 더 빼면 된다.
11111111 11111111 11111111 11111110 로 저장된다.

그래서 int 형으로 선언된 변수에는 최소 -2147483648 을 의미하는
10000000 00000000 00000000 00000000 부터

최대 +2147483647 을 의미하는
01111111 11111111 11111111 11111111 로 저장될 수 있는 것이다.

그렇다면 -2147483648
10000000 00000000 00000000 00000000 에서 1을 더 뺀다면?

01111111 11111111 11111111 11111111 이 된다.
즉 -2147483649 가 아닌 +2147483647 이 되는 것이다.

이러한 것을 오버플로우(overflow, 넘침)라고 한다.
이러한 내용을 간단히 표시하면, 정수 n이라고 할 때,

~n = -n - 1
-n = ~n + 1 과 같은 관계로 표현된다.
출처: 코드업 기초 100제 1059번 [기초-비트단위논리연산] 비트단위로 NOT하여 출력하기