[C언어-막코딩] 11장 비트연산자
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
오늘은 비트연산자에 대해 이야기를 할까 합니다. 비트연산자는 말 그대로 비트 단위로 어떤 동작을 수행하는 연산자입니다. C언어의 데이터는 공간은 작게는 1byte의 저장공간에 데이터를 넣거나 2byte, 4byte, 8byte 등의 데이터의 크기로 자료를 저장하게 됩니다. 여기서 1byte은 8bit로 구성되어 있고 이 bit를 조작하여 데이터의 값을 변화시키는 연산자가 바로 비트 연산자입니다. 말보다는 실제 비트 연산자를 실행 시켜서 그 의미를 이해하는 것이 좋기 때문에 개념 설명은 짧게 코딩으로 비트 연산자의 원리를 알아 보도록 하겠습니다.
1. 비트 연산자
비트 연산자는 다음과 같습니다.
자세히 보시면 논리연산자에서 봤던 기호들을 보실 수 있을 꺼에요. 논리 연산자에서 쌍기호였는데 여기에서는 한개짜리 기호네요. 처리하는 의미는 유사합니다. 의미적으로 같이 이해하시면 좋습니다. 참고로 논리연산자의 진리표로 이해하시는 것이 더 편하실거에요.
예) a=2, b=3
0010 & 0011 = 0010
0010 | 0011 = 0011
0010 ^ 0011 = 0001
어떤 느낌이신지 아시겠지요.
~은 1의 보수이고 <<, >> 은 비트 이동입니다. ~은 값의 1의보수를 취한 것이기 때문에 별도록 설명은 필요 없고 그외 <<, >> 부호에 대한 설명이 필요 합니다.
<<, >>은 시프트 연산자로서 기호의 방향을 잘 보시면 됩니다. 화살표 모양처럼 가리키는 방향으로 비트는 정해진 n만큼 이동시키라는 명령입니다.
2<<1은 0010을 1비트씩 왼쪽으로 이동하라?
0010 => 0100 => 4
2>>1은 0010을 1비트씩 오른쪽으로 이동하라?
0010 => 0001 => 1
어떤 느낌인지 아시겠지요.
그러면 3일때는 어떻게 오른쪽으로 1비트씩 이동한다면 넘어가는 비트는 어떻게 되는지 궁금해 하실 수 있습니다.
0011 => 0001 => 1
이렇게 넘어간 1은 그냥 사라집니다. 짤린다고 생각하시면 됩니다.
이제 위에서 설명한 것들이 정상적으로 동작하는지 코딩을 실행 시켜봐야 겠죠.
2. 코딩
[소스]
#include
int main(int argc, char *argv[]) {
int a=2, b=3;
printf("%d & %d = %d \n",a,b,a&b);
printf("%d | %d = %d \n",a,b,a|b);
printf("%d ^ %d = %d \n",a,b,a^b);
printf("~%d = %d \n",a,~a);
printf("%d<<1 = %d \n",a,a>>1);
printf("%d>>1 = %d \n",a,a<<1);
return 0;
}
[결과]
결과는 정수형태로 나와서 비트 정확히 어떻게 처리 되었는지는 약간 이해가 안 갈 수 있습니다. 해당 정수를 2진수 형태로 변환하면 결과가 정상적으로 처리되었는지 확인 할 수 있습니다. 2진수변환을 하시면 되니깐 결과들을 메모장에다 전부 2진수변환하시고 실행한 결과를 비교하시면서 정상적으로 동작하는지 확인 하시면 됩니다.
마무리
오늘은 비트연산자를 통해 데이터 값들을 조작을 해보았습니다. 이 부분은 딱히 초보분들이 써먹을 곳은 없을 거에요. 그냥 비트 계산은 이런식으로 한다는 것만 이해하시면 됩니다. 나중에 다른 특수 분야에 비트로 계산을 필요로 하기 때문에 지금은 비트 계산이 이런식으로 이루어진다는 것만 이해하고 넘어가시기 바랍니다. 지금 복잡하게 깊게 응용하여 써먹어야지 할 필요가 없습니다. 단순하게 이런 것도 있구나 정도로 이해하시고 넘어가시면 됩니다.