본문 바로가기

Programming/Codeup.kr기초100제 && 컴퓨터 이야기

[기초-비트단위논리연산] 비트단위로 바꿔 출력하기 && 아스키

ASCII는 American Standard Code for Information Interchange의 약자로 미국정보교환표준부호이다. 이는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 여러 장치에서 영문 알파벳ㅇ을 사용하는 문자 인코딩이다. 1967년에 표준적으로 제정되었고 1986년에 마지막으로 개정되었다. 7비트 인코딩이라 2의 7제곱인 128개를 저장할 수 있으며 33개의 제어문과 공백1개, 영어 대소문자 52개, 10개 숫자, 32개의 특수 문자로 95개의 출력가능 문자로 이루어진다. 8비트중 7비트를 사용한 이유가 나머지 1비트를 통신 에러 검출을 위해 남겨두었다고 한다. 통신에러 검출 방식은 7개의 비트중 1의 갯수가 짝수면 0 홀수면 1인 Parity Bit방식을 썼다. 현재는 아스키가 여러 문자를 지원하지 않아 쓰이지 않는다.

문제 설명

입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.

입력

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

출력

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

입력 예시

2

출력 예시

-3

도움말

비트단위(bitwise) 연산자 ~(tilde, 틸드라고 읽는다.)를 붙이면 된다.

** 비트단위(bitwise) 연산자는, 
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor), <<(bitwise left shift), >>(bitwise right shift) 가 있다.

^:(circumflex 써컴플렉스, caret 캐럿)


예를 들어 1(32비트 2진수로 표현하면 00000000 00000000 00000000 0000001) 이 입력되었을 때, 
~1은 -2(11111111 11111111 11111111 11111110) 가 된다.

예시
int a=1;
printf("%d", ~a); //-2가 출력된다.


참고
컴퓨터에 저장되는 모든 데이터들은 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 과 같은 관계로 표현된다.
이 관계를 그림으로 그려보면 마치 원형으로 수들이 상대적으로 배치된 것과 같다.