C++의 비트 연산자 중 &, |, ^, ~가 의미하는 것이 무엇인지 알아보겠다.
먼저 &은 곱하기 라고 생각하면 편할 것이다, 전자 회로쪽을 공부한 사람이라면 알고 있을 AND게이트의 역할과 동일하다고 보면 된다. 요약하자면 &은 둘다 1일 경우에만 1을 값을 반환한다고 보면 된다.
1010과 1001을 &으로 계산하게되면 1000이라는 결과 값이 나오게 되는데 이는 &이 둘다 1일 경우에만 1을 반환하는 연산을 하기 때문이다.
디버깅 결과 값 역시 2진수 1000, 즉 10진수 8이라는 결과값이 나오게 되었다.
그렇다면 비트연산자 |는 어떠한 연산을 할까?
|는 OR연산, 즉 덧셈을 한다고 생각하면 이해가 빠를것이다. 요약하자면 |는 둘중 하나라도 1이 있으면 1, 나머지는 0을
반환한다. 1010 과 1001을 |연산 할경우 1011이 될것이다.
디버깅 결과를 통해 11이 나오는것을 확인할 수 있다. 이처럼 | 비트 연산자는 둘중 하나라도 1이라면 1을 반환한다는 것을 알수있다.
그렇다면 비트연산자 ^는 어떠한 연산을 할까? ^는 XOR로 같으면 0 다르면 1을 반환하게 된다.
앞선 예시로 사용한 2진수 1010과 1001을 ^연산을 하면 결과값은 0011이 되는것이다.
위 그림처럼 같은 자리의 수가 같다면 0, 다르면 1이 반환되는것이다.
디버깅 결과 역시 3이 결과 값으로 나온것을 확인할 수 있다.
그렇다면 비트연산자 ~은 어떤 연산을 하는것 일까? ~은 NOT으로 0을 1로,1을 0으로 반전 시켜주는 연산을 한다.
예를 들어 1010 을 ~연산을 하게되면 결과 값이 0101이 되는것일까?
디버깅 결과 값은 -11이 나오게 되었다. 1010 을 반전시키면 0101로 5라는 값이 나올줄 알았는데 왜 -11이 나온것일까?
이를 이해하기 위해서는 컴퓨터에서 데이터의 표현 방식과 음수를 표현하는 방식을 알고있어야한다.
자료형 char은 1byte 데이터 타입으로 8bit의 크기를 갖는다.
char 변수 num1 = 1010은 실제 데이터 구조상 00001010 으로 데이터가 저장되어 있는 상태이다.
이를 반전시키면 11110101이 되는것이다.
8bit 데이터 공간에서 맨 앞에 있는 비트를 우리는 msb 또는 부호 비트라고 부른다
부호비트는 1이면 음수, 0이면 양수가 되는것이다. 즉 00001010을 반전시킨 1110101은 음수인것이다.
그리고 부호비트를 제외한 1110101이 숫자 영역이되는것이다.
숫자영역 1110101은 음수 표현방식으로 되어있다. 컴퓨터는 음수의 데이터 표시방식이 양수 표현방식과 다른데,
더해서 0을 만들어주는 비트가 즉 그 수의 음수가 되는 구조이다. 00001010 과 더해서 모든 자리수를 0으로 만들어 주는 그 숫자가 즉 그 수의 음수가 되는것이다.
풀어서 설명하자면 00001010은 10진수로 얘기하면 9, -9는 00001010과 더해서 모든자리의 비트를 0으로 만들어주는
비트인 1110110이 되는것이다. 2의 보수 법을 통해 쉽게 구할수 있다. 2의 보수법은 모든 수를 반전시킨후 그 값의 1만 더해주면 된다.
즉 00001010 을 ~로 반전 시키면 11110101이고 이 수를 양수로 치환하기 위해 부호 비트를 제외한 비트의 자리수를
2의 보수법을 통해 연산하면 (1)0001011 = -11, 앞선 결과값 -11이 나옴을 알수 있다.
이처럼 ~는 모든 자리의 비트 수를 반전 시키는 연산을 한다는 것을 알수 있다.
정리하자면,
&은 1을 0으로, 0을 1로,
|는 하나라도 1이면 1, 나머지는 0,
^는 같으면 0, 다르면 1,
~는 0을 1로, 1을 0으로 연산한다.
'C++' 카테고리의 다른 글
C++ 함수 호출(메모리 영역) (0) | 2023.11.05 |
---|---|
C++ 게임에서의 비트 연산 활용 (1) | 2023.11.04 |
C++ 비트 연산(시프트 연산) (0) | 2023.11.04 |
C++ 실수 표현 방식 (0) | 2023.11.03 |
C++ 정수 자료형 (0) | 2023.11.02 |