1058: [기초-비트단위 논리 연산] 비트단위로 NOT 하여 출력하기(설명)(C)

메모리제한:128 MB 시간제한:1.000 S
체점 스타일:텍스트 비교 만든사람:
제출:564 통과:444

문제 설명

본 문제는 C 의 빠른 기초 학습을 위해 설계된 문제로서 C 코드 제출을 기준으로 설명되어 있습니다.
------

입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.
비트단위(bitwise) 논리 연산자 ~를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)
예시
...
int a=1;
printf("%d", ~a); //-2가 출력된다.
...


참고
** 저장되어있는 비트단위로 계산하거나 처리하는 비트단위(bitwise) 연산자는
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor), <<(bitwise left shift), >>(bitwise right shift) 가 있다.

예를 들어, 1이 입력되었을 때 32비트 2진수로 저장된 +1을 표현하면
00000000 00000000 00000000 00000001 이고, 여기에 비트단위로 not 연산으로 ~1을 수행하면
11111111 11111111 11111111 11111110 가 되고, 이 값은 10진수로 -2를 의미한다. 

비트단위 not 연산은 각자리의 비트를 0->1, 1->0 과 같이 반대로 바꾸어 주는 것이다. 

컴퓨터로 저장, 처리되는 모든 데이터들은 2진수 형태의 디지털 데이터로 저장된다. 
양의 정수는 2진수 형태로 바뀌어 저장되고 음의 정수는 "2의 보수" 형태로 바뀌어 저장된다.

예를 들어, 
양의 정수 +5를 32비트로 저장한다고 하면,  5는 2진수로 101이므로 
00000000 00000000 00000000 00000101 로 저장된다. (보기 편하도록 8자리씩 분리함)

0 을 32비트로 저장한다고 하면, 0은 2진수로 0이므로  
00000000 00000000 00000000 00000000 로 저장된다. 

-1 은 0 에서 1 을 더 빼는 것이고 32 비트로만 표시하므로
11111111 11111111 11111111 11111111 로 저장된다.

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

32비트 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 = -n - 1
-n = ~n + 1 과 같은 관계로 표현할 수 있다.

입력 설명

정수 1개가 입력된다.
(-2147483648 ~ 2147483647)

출력 설명

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

입력 예시 복사

2

출력 예시 복사

-3

도움

기초100제(c)1 v1.5 : 정보교사 커뮤니티 @컴퓨터과학사랑(CSL)
- 중고등학교 정보 선생님들과 함께 정보수업/방과후/동아리활동 등을 통해 재미있게 배워보세요.
- 모든 내용 및 이미지들은 저작자와의 협의 없이 무단으로 사용할 수 없습니다.