악마반장 2023. 3. 1. 23:19

먼저 C++의 연산자 중에 비트연산자라는 것이 있다. 그럼 비트가 뭘까?

데이터를 나타내는 최소 단위 라고 한다. 모든 데이터는 0과 1의 조합으로 구성되는데, 이 0 또는 1이 하나의 비트가 된다

 

이때 1이나 0을 비트(bit) 라고 한다. 그리고 비트가 8 개가 모이면 바이트(byte)가 된다.

즉, 1byte = 8 bit

 

그럼 비트연산은 뭘까?

 

비트연산은 한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산이다. 

 

	int a = 0; // int는 4바이트 4바이트는 32비트
	int b = 0;

    // 이진표현법 
    a = 0b00000000000000000000000000000001; // 1
    b = 0b00000000000000000000000000000010; // 2

4바이트 정수형을 가장 직관적으로 표현한 것이다.

 

엑셀과 위 코드를  활용해서 좀 더 보기 쉽게 만들었다. (B열을 비트로 보겠습니다)

2진수의 표현방법은 알고 보면 간단하다. 무조건 이전 숫자의 x2이다.

 

그래서 1, 1, 1이라고 한다면 1, 2, 4가 더해져서 '7'이라는 값이 나오게 된다.

 

또한 우리가 일반적으로 부르는 int의 이름은 풀네임이 signed int이다.

signed은 부호를 뜻한다. - or + 를 나타낸다.

 

unsigned의 경우 부호를 없애겠다는 뜻.

 

일단 부호를 표현하기 위해서는 bit 하나가 필요하다. 그래서 맨 앞에 bit가 1이면 무조건 음수이다.

 

그렇다면 -1은 어떻게 표현할까?

    a = 0b10000000000000000000000000000001; // -1????

이것은 -1인 것일까?? 정답은 아니다. 

 

    a = 0b10000000000000000000000000000000; // -0 ???????

그럼 이건 -0인 건가??? 마이너스 0이라는 것은 없다. 그래서 너무나도 단순하게 위처럼 생각하면 0은 +0과 -0이 생겨버린다.

 

2의 보수법

a = 0b00000000000000000000000000000000; // 0

그래서 양수의 표현 방식은 맨 앞의 비트가 0일 때 처리되며, 어떤 비트가 1일 때 0 + 그 비트에 해당하는 양수를 더해준다.

 

비트가 1인 곳에 왼쪽을 보면 256이기 때문에 256이다.

(이게 표현방식)

 

음수의 표현방식은 맨 앞의 비트가 1일때 처리되며, 어떤 비트가 0일 때 -1 + 그 비트에 해당하는 음수를 더해준다.

a = 0b11111111111111111111111111111111; // -1

맨 앞의 비트가 1이니까 우리는 당연히 음수를 나타낸다는 것을 알 수 있고, 어떤 비트가 0일 때 그 비트에 해당하는 음수를 더해주어야 하는데 지금 위 비트에서는 0이 없다. -1 + 0이 되므로 위 비트의 음의 정수값이 -1이 되는 것.

그래서 이러한 규칙들을 2의 보수법이라고 한다.