본문 바로가기
프로그래밍/C++

비트연산자

by Nessie! 2022. 9. 5.
본 글은 공부용으로 작성된 게시글입니다.

비트 연산자(bitwise operator)

비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다.

또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.

 

bit연산은 왜 쓰는 걸까?

1. 짱빠룸 ㅎ

ㄴ bit는 최소정보단위로 다른 추상화된 정보들과는 달리 재현의 과정을 거치지 않는다. 따라서 재현의 과정을 거치지 않고 즉시 해석되어서 의미를 전달하기 때문에 그만큼 빠를 수 밖에 없다고한다.

2. 메모리 사용 공간 절약 (오늘날에는 최적화할때 외엔 거의 사용하지 않는다고한다)

ㄴ bool 자료형을 생각해보자. true와 false는 1비트 하나만 사용하지만 1바이트(8비트)나 차지한다. 
메모리의 가장 작은 메모리 단위는 1바이트 이기 때문인데, 이는 1비트를 사용하고 7비트를 낭비하게 된다.
bitwise 연산자를 사용하면 8개 bool 값을 한 개의 1바이트 bool 변수에 압축하여 넣을 수 있으므로 메모리를 절약할 수 있다.

 

비트 연산자(bitwise operator) 종류

 

&

대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
"주소 연산"으로 사용되기도 하나, 2항 연산자로 사용할 경우 비트연산으로 컴파일된다.
ㄴ 해당 연산자는 CPU의 레지스터에 접근하거나 메모리에 접근하여 원하는 bit 값을 출력할 때 주로 사용된다. 

|

대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
ㄴ 해당 연산자는 대응하는 bit 가 하나라도 1일 경우에 1을 출력 결과를 얻을 수 있는 비트 연산자이다. 

^

대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
ㄴ 해당 연산자는 대응하는 bit가 동일한 값일 경우 0을 출력하고 동일하지 않으면은 1을 출력하는 비트 연산자이다.
즉, "0011 1010 ^ 1110 1111" 의 결과값은 "1101 0101"의 값을 얻을 수 있다.
주로 암호화와 복호화에 사용되는 연산자이며, 특정 값을 0으로 초기화할 때도 유용하게 사용될 수 있다. 

~

비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)

<<

지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)

>>

부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

 

 

시프트 연산자

2항 연산자로 우항에 있는 값만큼 비트를 우측 또는 좌측으로 이동시키는 연산자이다.

 

ex) "0110 1010 >> 1" 결과 값은 "0011 0101" 

ex ) "0110 1010 << 1" 결과 값은 "1101 0100"

 

unsigned일 경우 bit 이동으로 부족한 bit 부분은 0으로 채워지게 되어있다. 

하지만, signed이며 음수일 경우는 1로 채워지게 된다. 

 

ex) "1010 0000 >> 1"의 결과 값은 "1101 1000"의 결과값을 얻을 수 있다. 

 

이유는 맨 앞의 bit를 MSB 즉, 부호비트이며 부호비트가 1일 경우 음수 0일 경우 양수를 표현하기 때문이다. 

 

signed 변수에서의 shift연산은 결과값을 예측하기가 어려워 거의 사용이 불가능하다고 한다. 

 

 

비트 연산자 사용 시 주의할 점

비트 연산자는 연산자 우선순위에서 거의 낮은 우선순위를 갖는다!! 우선순위에 유의하여 코드 작성이 필요하다.

'프로그래밍 > C++' 카테고리의 다른 글

[C++] STL map 컨테이너  (0) 2022.10.25
[C++] STL Deque 컨테이너  (0) 2022.10.25
함수포인터  (0) 2022.08.25
Lvalue Rvalue  (0) 2022.08.23
복사생성  (0) 2022.08.23

댓글