& |
비트단위 AND 연산을 한다. ex) n1 & n2; |
| |
비트단위 OR 연산을 한다. ex) n1 | n2; |
^ |
비트단위 XOR 연산을 한다. ex) n1 ^ n2; |
~ |
피연산자의 모든 비트를 반전시켜 반환한다. ex ) n2 = ~n1; n1은 변화 없음 |
<< |
피연산자의 비트열을 왼쪽으로 이동시켜 반환한다. ex) n2 = n1 << 2; 2칸 왼쪽으로 이동 n1은 변화 없음 |
>> |
피연산자의 비트열을 왼쪽으로 이동시켜 반환한다. ex) n2 = n1 >> 3; 3칸 오른쪽으로 이동 n1은 변화 없음 |
& 연산은 두개의 비트가 모두 1일때만 1을 반환한다.
#include <stdio.h>
int main(void) {
int a1 = 15; // 00001111
int a2 = 20; // 00010100
int a3 = a1 & a2; // 00000100
printf("& 비트의 AND 연산 : %d\n", a3);
return 0;
}
| 연산은 두개의 비트중 하나라도 1이면 1을 반환한다.
#include <stdio.h>
int main(void) {
int a1 = 15; // 00001111
int a2 = 20; // 00010100
int a3 = a1 | a2; // 00011111
printf("| 비트의 OR 연산 : %d\n", a3);
return 0;
}
^ 연산은 두개의 비트가 서로 다를 경우에 1을 반환한다.
#include <stdio.h>
int main(void) {
int a1 = 15; // 00001111
int a2 = 20; // 00010100
int a3 = a1 ^ a2; // 00011011
printf("^ 비트의 XOR 연산 : %d\n", a3);
return 0;
}
~ 연산은 0은 1로 1은 0으로 반전시킨다. 보수연산이라고도 한다.
#include <stdio.h>
int main(void) {
int a1 = 15; // 00001111
int a2 = ~ a1; // 11110000
printf("~ 비트의 NOT 연산 : %d\n", a2);
return 0;
}
<<, >> 는 비트를 이동(Shift) 시킨다.
정수에서 <<는 비트를 1 왼쪽으로 이동시킬때 마다 값이 2배가 되고,
>>는 비트를 1 오른쪽으로 이동시킬때 마다 2로 나누어진다.
#include <stdio.h>
int main(void) {
int a1 = 15; // 00001111
int left1 = a1 << 1; // 00011110
int left2 = a1 << 2; // 00111100
int left3 = a1 << 3; // 01111000
int b1 = -16;
int right1 = b1 >> 1; // 11110000
int right2 = b1 >> 2; // 11111000
int right3 = b1 >> 3; // 11111100
printf(" 비트의 << 1 연산 : %d\n", left1);
printf(" 비트의 << 2 연산 : %d\n", left2);
printf(" 비트의 << 3 연산 : %d\n", left3);
printf(" 비트의 >> 1 연산 : %d\n", right1);
printf(" 비트의 >> 2 연산 : %d\n", right2);
printf(" 비트의 >> 3 연산 : %d\n", right3);
return 0;
}
연습문제
3 × 8 ÷ 4 의 결과를 출력하는 프로그램을 작성하세요.
단 * 와 / 연산자를 사용하지 말고 bit연산자를 사용하세요.