티스토리 뷰
🖥️ 비트 연산자의 종류와 활용법
비트 연산(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
'ㅈㄱㅈ > ㅈㅊㄱ' 카테고리의 다른 글
정적 테스트와 동적 테스트 (0) | 2025.04.17 |
---|---|
페이지 교체 알고리즘 문제 풀이 가이드 (0) | 2025.04.17 |
페이지 교체 알고리즘: 종류 (0) | 2025.04.15 |
[JAVA] 상속과 캐스팅: 기본 생성자 유무에 따른 동작 방식 (0) | 2025.04.15 |
정보보안의 이해와 주요 요소 (0) | 2025.04.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 단위변환
- 로스터리
- table
- SQL
- backup
- Filter
- VBS
- 리리 커피
- BAT
- partition
- Eclipse
- 커피
- JSP
- 스페셜티
- db
- oracle
- MariaDB
- MySQL
- Coffee
- SEQUENCE
- popup
- Powershell
- handdrip
- diff
- date
- LILI COFFEE
- JavaScript
- dbeaver
- Between
- GitHub
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함