비트 연산(Bitwise operation)은 한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산이다.

* int 는 부호가 있는 정수라는 점을 잊지 말자.

● AND 연산자 : &
a & b : a, b 둘 다 '참' 일 때 1을 반환
예) 0 & 0 => 0
 0 & 1 => 0
 1 & 1 => 1

소스)

int main()
{
	int a = 4;	//0000 0100
	int b = 20;	//0001 0100
	int c = a & b;	//0000 0100
	printf("a & b = %d \n", c); // 4
	return 0;
}

● OR 연산자 : |
a | b : a, b 중 하나라도 '참' 일 때 1을 반환
예) 0 | 0 => 0
 0 | 1 => 1
 1 | 1 => 1

소스)

int main()
{
	int a = 4;	//0000 0100
	int b = 20;	//0001 0100
	int c = a | b;	//0001 0100
	printf("a | b = %d \n", c); // 20
	return 0;
}

● XOR 연산자 : ^
a ^ b : a, b 두 값이 서로 다를 때 1을 반환
예) 0 ^ 0 => 0
 0 ^ 1 => 1
 1 ^ 1 => 0

소스)

int main()
{
	int a = 4;	//0000 0100
	int b = 20;	//0001 0100
	int c = a ^ b ;	//0001 0000
	printf("a ^ b = %d \n", c); // 16
	return 0;
}

● NOT 연산자 : ~
~a : 값을 반대로 나타낸다.
예) ~0 => 1
 ~1 => 0

소스)

int main()
{
	int a = 4;	//0000 0100
	int c = ~a ;	//1111 1011 -> 부호있는 2의 보수의 형식이다.
	printf("~a = %d \n", c); // -5
	return 0;
}

● 왼쪽 쉬프트 연산자 : <<
a << b : a의 비트들을 b칸씩 왼쪽으로 이동, a*2b의 값이 된다.
예) 18의 2인수 0001 0010 의 비트들을 왼쪽으로 두 칸씩 이동 : 0100 1000 -> 72

소스)

int main()
{
	int a = 18;
	int c = a << 2;	// 72 -> 18*4
	printf("%d << %d = %d \n", a, 2, c); 
	return 0;
}

● 오른쪽 쉬프트 연산자 : >>
a >> b : a의 비트들을 b칸씩 왼쪽으로 이동, a/2b의 값이 된다.
예) 72의 2진수 0100 1000 의 비트들을 오른쪽으로 2칸 이동 : 0001 0010 -> 18

소스)

int main()
{
	int a = 72;
	int c = a >> 2;	// 18 -> 72/4
	printf("%d >> %d = %d \n", a, 2, c); 
	return 0;
}

 

Posted by 파이군
,