JavaScript Bitwise
JavaScript Bitwise: 비트 연산자의 이해와 활용
JavaScript 비트 연산자(bitwise operators)는 숫자를 **이진수(bit)**로 변환한 후 비트 단위로 연산하는 연산자입니다. 비트 연산은 컴퓨터가 데이터를 가장 기본적으로 처리하는 방식 중 하나로, 낮은 수준의 연산을 효율적으로 수행할 수 있습니다. 비트 연산자는 일반적으로 정수형 값에 적용됩니다.
이 가이드는 JavaScript에서 사용할 수 있는 비트 연산자와 그 활용 방법을 설명합니다.
1. 비트 연산의 기본 개념
JavaScript의 비트 연산자는 32비트 부호 있는 정수로 변환된 후 비트 단위로 처리됩니다. 비트 연산을 적용할 때, 숫자는 **이진수(binary)**로 변환되어 각 비트의 값이 연산됩니다.
이진수 예시
const num = 5; // 10진수 5는 이진수로 101
2. 비트 연산자의 종류
2.1. AND (&
)
AND 연산자는 두 비트가 모두 1일 때 1을 반환하고, 그렇지 않으면 0을 반환합니다.
const a = 5; // 5는 이진수로 101
const b = 3; // 3은 이진수로 011
const result = a & b;
console.log(result); // 출력: 1 (이진수 001)
a | b | a & b |
---|---|---|
1 | 1 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
2.2. OR (|
)
OR 연산자는 두 비트 중 하나라도 1이면 1을 반환하고, 둘 다 0이면 0을 반환합니다.
const a = 5; // 5는 이진수로 101
const b = 3; // 3은 이진수로 011
const result = a | b;
console.log(result); // 출력: 7 (이진수 111)
| a | b | a | b | | --- | --- | --- | | 1 | 1 | 1 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 0 | 0 | 0 |
2.3. XOR (^
)
XOR 연산자는 두 비트가 서로 다를 때 1을 반환하고, 같으면 0을 반환합니다.
const a = 5; // 5는 이진수로 101
const b = 3; // 3은 이진수로 011
const result = a ^ b;
console.log(result); // 출력: 6 (이진수 110)
a | b | a ^ b |
---|---|---|
1 | 1 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
0 | 0 | 0 |
2.4. NOT (~
)
NOT 연산자는 비트 반전을 수행합니다. 즉, 0은 1로, 1은 0으로 변환됩니다. 이 연산자는 숫자의 모든 비트를 뒤집습니다.
const a = 5; // 5는 이진수로 101
const result = ~a;
console.log(result); // 출력: -6
NOT 연산의 결과는 음수로 나타나는 이유는 2의 보수(Two's Complement) 표현 방식 때문입니다.
2.5. 왼쪽 시프트 (<<
)
왼쪽 시프트(Left Shift) 연산자는 비트를 왼쪽으로 지정된 수만큼 이동시키며, 오른쪽에서 빈 자리는 0으로 채웁니다.
const a = 5; // 5는 이진수로 101
const result = a << 1; // 왼쪽으로 1비트 이동
console.log(result); // 출력: 10 (이진수 1010)
2.6. 오른쪽 시프트 (>>
)
오른쪽 시프트(Right Shift) 연산자는 비트를 오른쪽으로 지정된 수만큼 이동시키며, 왼쪽에서 빈 자리는 부호 비트로 채워집니다. 즉, 양수는 0으로, 음수는 1으로 채웁니다.
const a = 5; // 5는 이진수로 101
const result = a >> 1; // 오른쪽으로 1비트 이동
console.log(result); // 출력: 2 (이진수 10)
2.7. 부호 없는 오른쪽 시프트 (>>>
)
부호 없는 오른쪽 시프트는 부호 비트가 없는 오른쪽 시프트 연산입니다. 빈 자리는 항상 0으로 채워집니다.
const a = -5;
const result = a >>> 1;
console.log(result); // 출력: 2147483645
3. 비트 연산 활용 예시
3.1. 짝수와 홀수 구분
비트 연산을 사용하여 짝수와 홀수를 빠르게 구분할 수 있습니다. & 1
연산을 통해
숫자의 마지막 비트가 1이면 홀수, 0이면 짝수입니다.
function isOdd(num) {
return (num & 1) === 1;
}
console.log(isOdd(5)); // 출력: true (홀수)
console.log(isOdd(8)); // 출력: false (짝수)
3.2. 값을 두 배로 만들기 (왼쪽 시프트)
왼쪽 시프트(<<
) 연산을 사용하면 값을 빠르게 2배로 만들 수 있습니다.
const a = 5;
const result = a << 1;
console.log(result); // 출력: 10
3.3. 값 나누기 (오른쪽 시프트)
오른쪽 시프트(>>
) 연산을 사용하면 값을 2로 나눌 수 있습니다.
const a = 10;
const result = a >> 1;
console.log(result); // 출력: 5
4. 비트 연산과 실무 활용
비트 연산은 컴퓨터 과학과 프로그래밍의 여러 분야에서 성능을 최적화하거나, 효율적으로 데이터를 처리하는 데 사용됩니다. 다음은 실무에서 비트 연산이 사용되는 몇 가지 사례입니다.
4.1. 권한 관리
비트 연산을 사용하여 권한 관리를 할 수 있습니다. 각 비트는 특정 권한을 나타내며, 이를 통해 여러 권한을 하나의 숫자로 저장하고 관리할 수 있습니다.
const READ = 1; // 001
const WRITE = 2; // 010
const EXECUTE = 4; // 100
let permission = READ | WRITE; // 읽기 + 쓰기 권한
// 권한 확인
const hasWritePermission = (permission & WRITE) !== 0;
console.log(hasWritePermission); // 출력: true
// 실행 권한 추가
permission |= EXECUTE;
console.log(permission); // 출력: 7 (111)
4.2. 플래그 처리
비트 연산은 플래그 처리를 할 때 자주 사용됩니다. 여러 상태 값을 하나의 숫자로 결합하여 메모리를 절약하고, 상태를 쉽게 관리할 수 있습니다.
const FLAG_A = 1; // 001
const FLAG_B = 2; // 010
const FLAG_C = 4; // 100
let flags = FLAG_A | FLAG_B; // 플래그 A와 B 활성화
// 플래그 C 활성화
flags |= FLAG_C;
console.log(flags); // 출력: 7 (111)
// 플래그 B 제거
flags &= ~FLAG_B;
console.log(flags); // 출력: 5 (101)
요약
- 비트 연산자는 숫자를 이진수로 변환한 후 비트 단위로 연산하는 연산자입니다.