※요약

당연한 얘기겠지만 비트 연산자는 비트를 연산하기 위한 연산자입니다.

비트란( bit )란 기억 장치의 최소 단위로써 1이나 0을 저장하며 8개가 모여 1Byte를 이룹니다.

비트 연산은 정수나 정수로 변환 가능한 타입만 가능하며, 실수나 포인터 등은 비트 연산을 할 수 없습니다.


아래는 8bit( 1Byte )공간에 10진수로는 89, 16진수로는 0x59가 저장되어 있는 모양입니다.

128

64

32

16

8

4

2

1

0

1

0

1

1

0

0

1

64 + 16 + 8 + 1 = 89 입니다.



※비트 연산자 표

연산자

피연산자 개수

설명

~ (NOT)

1개, 단항

비트를 반전 시킨다.

& (AND)

2개, 이항

두 개의 비트가 모두 1일 때 1

| (OR)

2개, 이항

두 개의 비트 중 1개만 1이어도 1

^ (XOR)

2개, 이항

두 개의 비트가 같으면 0, 다르면 1

<<

2개, 이항

지정한 수만큼 왼쪽으로 비트들을 이동

>>

2개, 이항

지정한 수만큼 오른쪽으로 비트들을 이동

마스크 오프 : 특정 비트를 강제로 0으로 만드는 연산을 mask off라고 하며 &연산자가 쓰인다.

마스크 온 : 특정 비트를 강제로 1로 만드는 연산을 mask on이라고 하며 |연산자가 쓰인다.

마스크 반전 : 반전시키고자 하는 부분만 반전 시키는 연산을 마스크 반전이라 하며 ^연산자가 쓰인다.



※비트 연산자 진리표

b1

b2

b1 & b2

b1 | b2

b1 ^ b2

~b1

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0



※쉬프트 연산자 <<, >>

0

1

0

1

1

0

0

1

상기의 0101 1001을 a라고 하고 쉬프트 연산을 통해 좌측으로 2칸 옮겨 보겠습니다.


a << 2

0

1

0

1

1

0

0

1

<<2

0

1

1

0

0

1

0

0

보시다시피 좌측으로 2칸 이동하였습니다.

이 때 좌측 두 칸은 버리고, 오른쪽 두 칸은 0으로 채웁니다.



※예제

#include <stdio.h>

int main( )
{
	int nNum1 = 3;
	int nNum2 = 5;
	int nResult = 0;

	nResult = nNum1 & nNum2;
	printf( "%d & %d 연산 : %d\n", nNum1, nNum2, nResult );

	nResult = nNum1 | nNum2;
	printf( "%d | %d 연산 : %d\n", nNum1, nNum2, nResult );

	nResult = nNum1 ^ nNum2;
	printf( "%d ^ %d 연산 : %d\n", nNum1, nNum2, nResult );

	nResult = ~nNum1;
	printf( "%d ~ %d 연산 : %d\n", nNum1, nNum2, nResult );

	nResult = nNum1 << 2;
	printf( "%d << %d 연산 : %d\n", nNum1, 2, nResult );

	nResult = nNum1 >> 2;
	printf( "%d >> %d 연산 : %d\n", nNum1, 2, nResult );

	return 0;
}


+ Recent posts