비트 연산자는 이진수(bit) 단위로 연산을 수행하는 연산자입니다. 비트 연산자는 주로 저수준의 데이터 처리나 특정 성능 최적화 작업에 사용된다.
- 마스크(mask) 작업: 특정 비트만 남기거나 지우는 데 사용됩니다.
- 플래그 작업: 여러 옵션을 비트로 표현하고, 플래그를 설정하거나 확인하는 데 사용됩니다.
- 성능 최적화: 비트 연산은 매우 빠르며, 곱셈/나눗셈 대신 시프트 연산을 사용해 성능을 최적화할 수 있습니다.
& (비트 AND)
- 두 개의 숫자의 각 비트를 비교하여 둘 다 1일 경우에만 1을 반환
- 주로 짝, 홀수를 구분할 때 사용한다
let num1 = 5; // 0101
let num2 = 4; // 0100
let num3 = 1; // 0001
// 0 1 0 1
// 0 1 0 0
// 0 0 0 1
console.log(num1 & num3); // 1
console.log(num2 & num3); // 0
| (비트 OR)
- 두 개의 숫자의 각 비트를 비교하여 하나라도 1이면 1을 반환하는 연산
- 여러 상태 값을 결합 또는 플래그 설정 작업등에 사용한다
let num1 = 5; // 0101
let num2 = 4; // 0100
let num3 = 1; // 0001
// 0 1 0 1
// 0 1 0 0
// 0 0 0 1
console.log(num1 | num3); // 1
console.log(num2 | num3); // 1
const FLAG_READ = 0b0001; // 읽기 권한
const FLAG_WRITE = 0b0010; // 쓰기 권한
const FLAG_EXECUTE = 0b0100; // 실행 권한
let permissions = FLAG_READ | FLAG_WRITE; // 읽기와 쓰기 권한을 설정
console.log(permissions); // 출력: 3 (이진수로 0011)
// 쓰기 권한이 있는지 확인
if (permissions & FLAG_WRITE) {
console.log("쓰기 권한이 있습니다.");
}
^ (비트 XOR)
- 두 비트가 서로 다를 때 1을 반환
- 특정 비트를 반전, 두 값을 비교해 서로 다른 비트 찾기, 데이터 암호화
// 비트 토글(반전)
let value = 0b0101; // 이진수 0101 (10진수로 5)
let mask = 0b0010; // 반전할 비트 위치 (10진수로 2)
let toggledValue = value ^ mask; // 결과는 0111 (10진수로 7)
console.log(toggledValue); // 출력: 7
// 두 값의 차이 비교
let a = 0b1100; // 12
let b = 0b1010; // 10
let diff = a ^ b; // 결과는 0110 (10진수로 6)
console.log(diff); // 출력: 6
// 데이터 암호화, 복호화
let data = 0b1101; // 원본 데이터 (13)
let key = 0b1010; // 암호화 키 (10)
// 암호화
let encrypted = data ^ key; // 결과는 0111 (10진수로 7)
console.log(encrypted); // 출력: 7
// 복호화
let decrypted = encrypted ^ key; // 다시 원본 데이터로 복호화
console.log(decrypted); // 출력: 13
// 값 스왑
let a = 5; // a = 5 (0101)
let b = 9; // b = 9 (1001)
a = a ^ b; // a는 이제 1100 (둘의 XOR 값)
b = a ^ b; // b는 이제 5 (원래 a의 값)
a = a ^ b; // a는 이제 9 (원래 b의 값)
console.log(a); // 출력: 9
console.log(b); // 출력: 5
<< (비트 왼쪽 시프트)
- 숫자의 비트를 왼쪽으로 지정한 수만큼 이동하고 오른쪽 빈자리를 0으로 채움
- 빠른 곱셈 연산(2^n, 2 ** n), 비트 마스킹, 데이터 압축 및 전송
let number = 3; // 3 (이진수로 0011)
let result = number << 2; // 2비트 왼쪽으로 이동
console.log(result); // 출력: 12 (이진수로 1100)
let mask = 1 << 3; // 1을 왼쪽으로 3비트 시프트하여 마스크 생성 (이진수로 1000)
console.log(mask); // 출력: 8 (이진수로 1000)
let part1 = 0b0001; // 4비트 데이터
let part2 = 0b0010; // 4비트 데이터
let combined = (part1 << 4) | part2; // part1을 왼쪽으로 4비트 이동 후 결합
console.log(combined); // 출력: 18 (이진수로 00010010)
>> (비트 오른쪽 시프트)
- 숫자의 비트를 오른쪽으로 지정한 수만큼 이동하고 이동된 자리는 부호 비트(양수면 0, 음수면 1)로 채워짐
- 빠른 나눗셈(2^n, a * (2 ** -n) ), 부호 있는 정수에서 부호 비트 처리, 비트 추출 및 분리
let number = 16; // 16 (이진수로 10000)
let result = number >> 2; // 2비트 오른쪽으로 이동
console.log(result); // 출력: 4 (이진수로 000100)
let negativeNumber = -16; // -16 (이진수로 11110000)
let shifted = negativeNumber >> 2; // 2비트 오른쪽으로 이동
console.log(shifted); // 출력: -4 (이진수로 11111100)
let packedValue = 0b11011010; // 8비트 데이터 (218)
let extracted = packedValue >> 4; // 상위 4비트를 추출
console.log(extracted & 0b00001111); // 하위 4비트만 추출