티스토리 뷰

안녕하세요, IT디자이너입니다. 

 

이번 포스팅은 C언어와 C++언어의 비트연산자의 사용방법과 활용용도에 관하여 설명드리도록 하겠습니다. 

 

비트연산자란 우리가 사용하는 char, int, double과 같이 byte단위의 정수 또는 실수 연산이 아닌 말 그대로 bit 단위로

2진수형태로 접근하여 연산하는 연산자입니다. 

 

우리가 주로 사용하는 데이터 타입인 char(1Byte)는 8개의 bit로 표현될 수 있으며, 만약 char 라는 데이터에 1을 대입하여 2진수로 출력하였을 때 000000001 이라는 값이 출력됩니다. 

 

지금부터 8개의 bit를 기준으로 설명드리도록 하겠습니다.

 

1. & ( AND )

 

&연산자는 포인터를 배우셨다면 "주소 연산" 이라고 알고계실겁니다. 하지만 2항 연산자로서 사용할 경우 비트연산이으로 컴파일됩니다.

 

0000 0001 & 0000 0011 연산의 결과는 0000 0001 이 됩니다. 즉 대응되는 bit 값이 1로 동일하지 않으면 0이 출력되고 1로 동일하면 대응하는 bit의 연산 결과가 1로 출력됩니다. 

 

CPU의 레지스터에 접근하거나 메모리에 접근하여 원하는 bit 값을 출력할 때 주로 사용합니다. 

 

ex) edx == 0001 0011 에서 하위 4bit를 출력하고 싶을 때 edx & 0000 1111 연산으로 하위 4bit를 얻습니다.

 

2. | ( OR )

 

| 연산자는 대응하는  bit 가 하나라도 1일 경우에 1을 출력 결과를 얻을 수 있는 비트 연산자입니다. 

 

즉, "0001 1111 | 1000 0000"의 출력 결과는 "1001 1111"의 출력 결과를 얻을 수 있습니다.  

 

 

3. ^ ( XOR )

 

^ 연산자는 대응하는 bit가 동일한 값일 경우 0을 출력하고 동일하지 않으면은 1을 출력하는 비트 연산자입니다. 

 

즉, "0011 1010 ^ 1110 1111" 의 결과값은 "1101 0101"의 값을 얻을 수 있습니다.

 

주로 암호화와 복호화에 사용되는 연산자이며, 특정 값을 0으로 초기화할 때도 유용하게 사용될 수 있습니다. 

 

사례 

  • ex) a = 2; 일 경우   a ^ a 값은 0의 출력결과를 얻을 수 있습니다.  
  • 함수의 return 값이 0일 경우 레지스터를 xor연산하여 반환합니다.

 

  • 윈도우 환경에서 마우스의 커서에 따라서 발생하는 색상이 바뀌는 이벤트는 거의 xor연산을 사용합니다.

 

4. ~ ( 비트 단위 NOT )

~ 연산자는 bit를 반전시키는 연산을 합니다. 

1의 값을 ~ 연산시  "1111 1110"의 10진수 값인 254의 출력결과를 얻을 수 있습니다.

 

5. <<, >> (비트 이동)

비트 이동은 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연산은 결과값을 예측하기가 어려워 거의 사용이 불가능합니다. 

 

 

6. 비트연산자의 특징 및 추가 설명

 

비트 연산자는 연산자 우선순위에서 거의 낮은 우선순위를 갖습니다. 주로 코딩테스트에서 연산자 우선순위 관련하여 문제가 종종 출제된다고 합니다. 

 

int a = 3*5 << 2*3 << 1; 이런 경우의 문제에서 <<연산자는 *연산자보다 낮은 우선순위를 가지고 있는데,

많은 사람들이 bit단위 연산자이니 우선순위가 높은 연산자로 착각하는 경우가 많습니다. !!!

우선순위표를 꼭 한번 확인해주시는게 좋을것 같습니다. 

 

 


추가적으로 bit단위 연산자가 일반 연산자에 비해 상당히 빠른 결과를 얻을 수 있습니다.

과거에는 곱하기나 나누기 연산자 대신 << 또는 >> 연산자를 이용하여 표현하였다고 합니다. 하지만,

( 워낙 컴퓨터 성능이 좋아져서 요즘은 이렇게까지 연산자를 사용하는 경우는 극히 드뭅니다.!! ^_^ )

 

이상 비트연산자에 관하여 설명을 마치겠습니다.

 

감사합니다.!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함