티스토리 뷰

비트 연산자의 종류와 활용법

🖥️ 비트 연산자의 종류와 활용법

비트 연산(Bitwise Operation)은 컴퓨터가 데이터를 처리하는 가장 기본적인 단위인 비트(bit) 수준에서 수행하는 연산입니다. 비트 연산자를 사용하면 정수형 데이터를 0과 1의 이진수 집합으로 간주하여 각 비트를 직접 조작할 수 있습니다. 이를 통해 매우 빠르고 효율적인 연산이 가능하며, 주로 저수준 프로그래밍, 하드웨어 제어, 데이터 압축 및 암호화, 알고리즘 최적화 등 다양한 분야에서 활용됩니다.

주요 비트 연산자 종류

대부분의 프로그래밍 언어에서 지원하는 주요 비트 연산자는 다음과 같습니다. (예시: a = 5 (0101), b = 3 (0011))

연산자 이름 설명 예시 (a, b) 결과
& AND 두 비트가 모두 1일 때만 1을 반환합니다. 0101 & 0011 0001 (1)
| OR 두 비트 중 하나라도 1이면 1을 반환합니다. 0101 | 0011 0111 (7)
^ XOR 두 비트가 서로 다를 때만 1을 반환합니다. 0101 ^ 0011 0110 (6)
~ NOT 모든 비트를 반전시킵니다. (0은 1로, 1은 0으로) ~0101 ...11111010 (-6)
<< Left Shift 지정한 수만큼 비트를 왼쪽으로 이동시킵니다. (값 x 2n) 0101 << 1 1010 (10)
>> Right Shift 지정한 수만큼 비트를 오른쪽으로 이동시킵니다. (값 / 2n) 0101 >> 1 0010 (2)

비트 연산자 활용법

1. 특정 비트 확인 (Checking a Bit)

& 연산자를 사용하여 특정 위치의 비트가 켜져 있는지(1인지) 확인할 수 있습니다.

활용: n번째 비트가 1인지 확인하기
방법: (숫자 & (1 << n)) != 0

int num = 5; // 0101
// 2번째 비트(0부터 시작)가 1인지 확인
bool isSet = (num & (1 << 2)) != 0; // (0101 & 0100) -> 0100 (true)
// 1번째 비트가 1인지 확인
bool isSet2 = (num & (1 << 1)) != 0; // (0101 & 0010) -> 0000 (false)

2. 특정 비트 켜기 (Setting a Bit)

| 연산자를 사용하여 특정 위치의 비트를 1로 설정(켜기)할 수 있습니다.

활용: n번째 비트를 1로 만들기
방법: 숫자 | (1 << n)

int num = 5; // 0101
// 1번째 비트를 켠다.
int result = num | (1 << 1); // 0101 | 0010 -> 0111 (7)

3. 특정 비트 끄기 (Clearing a Bit)

&~ 연산자를 조합하여 특정 위치의 비트를 0으로 설정(끄기)할 수 있습니다.

활용: n번째 비트를 0으로 만들기
방법: 숫자 & ~(1 << n)

int num = 5; // 0101
// 2번째 비트를 끈다.
// ~(1 << 2)는 ...11111011
int result = num & ~(1 << 2); // 0101 & ...1011 -> 0001 (1)

4. 특정 비트 토글 (Toggling a Bit)

^ 연산자를 사용하여 특정 위치의 비트를 반전(0이면 1로, 1이면 0으로)시킬 수 있습니다.

활용: n번째 비트를 반전시키기
방법: 숫자 ^ (1 << n)

int num = 5; // 0101
// 2번째 비트를 토글한다. (1 -> 0)
int result1 = num ^ (1 << 2); // 0101 ^ 0100 -> 0001 (1)
// 1번째 비트를 토글한다. (0 -> 1)
int result2 = num ^ (1 << 1); // 0101 ^ 0010 -> 0111 (7)

5. 플래그(Flags) 관리 / 권한(Permission) 제어

하나의 정수 변수에 여러 개의 상태(ON/OFF)를 저장하고 관리할 때 매우 유용합니다. 각 비트가 하나의 상태를 나타냅니다.

활용: 파일 권한(읽기, 쓰기, 실행) 관리

const int READ_PERMISSION = 1 << 0;  // 001 (1)
const int WRITE_PERMISSION = 1 << 1; // 010 (2)
const int EXECUTE_PERMISSION = 1 << 2;// 100 (4)
int myPermission = 0; // 현재 권한 없음
// 쓰기 권한 추가
myPermission |= WRITE_PERMISSION; // 000 | 010 -> 010
// 읽기 권한 추가
myPermission |= READ_PERMISSION; // 010 | 001 -> 011
// 현재 권한: 읽기, 쓰기 가능
// 쓰기 권한이 있는지 확인
if ((myPermission & WRITE_PERMISSION) != 0) {
// 쓰기 권한 있음
}
// 실행 권한 제거 (이미 없지만)
myPermission &= ~EXECUTE_PERMISSION;

6. 홀수/짝수 판별

어떤 수의 마지막 비트가 1이면 홀수, 0이면 짝수입니다. & 1 연산으로 간단하게 판별할 수 있습니다.

활용: 숫자의 홀짝 판별
방법: (숫자 & 1) == 1 이면 홀수, == 0 이면 짝수

int num1 = 10; // 1010
int num2 = 7;  // 0111
bool isOdd1 = (num1 & 1) == 1; // (1010 & 0001) -> 0, false
bool isOdd2 = (num2 & 1) == 1; // (0111 & 0001) -> 1, true

7. 빠른 곱셈과 나눗셈

시프트 연산자(<<, >>)는 2의 거듭제곱에 대한 곱셈과 나눗셈을 매우 빠르게 수행합니다.

활용: 2의 거듭제곱 곱셈/나눗셈
방법: 숫자 << n (x 2n), 숫자 >> n (/ 2n)

int num = 10;
int mul_by_4 = num << 2; // 10 * (2^2) = 40
int div_by_2 = num >> 1; // 10 / (2^1) = 5
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함