JAVASCRIPT

[Javascript] 자바스크립트의 비트 연산자 (Bitwise Operators)

seominki 2024. 9. 4. 16:29

비트 연산자는 이진수(bit) 단위로 연산을 수행하는 연산자입니다. 비트 연산자는 주로 저수준의 데이터 처리나 특정 성능 최적화 작업에 사용된다.

  1. 마스크(mask) 작업: 특정 비트만 남기거나 지우는 데 사용됩니다.
  2. 플래그 작업: 여러 옵션을 비트로 표현하고, 플래그를 설정하거나 확인하는 데 사용됩니다.
  3. 성능 최적화: 비트 연산은 매우 빠르며, 곱셈/나눗셈 대신 시프트 연산을 사용해 성능을 최적화할 수 있습니다.

& (비트 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비트만 추출