개요
자바스크립트에서는 다양한 연산자가 있다.
- & (AND 논리 연산자)
- | (OR 논리 연산자)
- ^ (배타 논리 연산자)
- ~ (부정 논리 연산자)
- << (왼쪽 비트 시프트 연산자)
- >> (오른쪽 비트 시프트 연산자)
- >>> (부호 없는 오른쪽 비트 시프트 연산자)
AND부터 부정 논리 연산자까지는 보편적으로 사용되기 때문에 낯이 익을 것이다.
하지만 비트 시프트 연산자들의 경우 우리가 평상시 코딩을 할 때 사용할 일이 많지가 않아 다소 생소할 수 있다.
오늘은 비트 시프트 연산자에 대해 자세하게 알아보려고 한다.
비트 시프트 연산자
비트 시프트 연산(Bitwise Shift)은 자바스크립트에서 숫자를 비트 단위로 이동시키는 연산이다. Shift가 영단어 그대로 (옮기다)이며 Bit를 옮긴다라는 느낌으로 이름이 지어진 것 같다. 이 연산은 퍼포먼스가 중요한 상황이나 비트 단위의 데이터 처리가 필요한 경우에 주로 사용된다. 자바스크립트에서 제공하는 비트 시프트 연산의 종류와 동작 방식을 아래의 예시들과 함께 정리해 보았다.
1. 왼쪽 시프트 연산자 (<<)
왼쪽 시프트 연산은 숫자의 비트를 왼쪽으로 이동시키며, 오른쪽에서 생기는 빈자리는 0으로 채운다.
연산의 기본 형식은 a << b이며, 이는 a를 왼쪽으로 b번 이동시키는 것을 의미한다.
예시 1)
const num = 5; // 이진수로 00000101
const result = num << 2; // 왼쪽으로 2칸 이동 -> 00010100
console.log(result); // 20
결과적으로 << 연산은 숫자를 2^b만큼 곱하는 효과가 있다.
2. 오른쪽 시프트 연산자 (>>)
오른쪽 시프트 연산은 숫자의 비트를 오른쪽으로 이동시키며, 왼쪽에서 생기는 빈자리는 숫자의 부호에 따라 채운다.
양수일 경우 0으로, 음수일 경우 1로 채워진다.
예시 2)
const num = 20; // 이진수로 00010100
const result = num >> 2; // 오른쪽으로 2칸 이동 -> 00000101
console.log(result); // 5
음수일 때도 동일하게 동작한다.
3. 부호 없는 오른쪽 시프트 연산자 (>>>)
>>> 연산자는 부호를 무시하고 오른쪽으로 비트를 이동시킨다. 왼쪽에서 생기는 빈자리는 항상 0으로 채워진다.
음수도 양수처럼 처리된다.
예시 3)
const num = -20; // 이진수로 음수를 표현 -> 11101100
const result = num >>> 2; // 부호 무시, 오른쪽으로 2칸 이동 -> 00111011
console.log(result); // 1073741819 (양수로 변환됨)
활용사례
사용빈도가 높지는 않지만 당연히 활용사례는 꼭 있다.
아래의 내용에서 몇 가지 활용 사례를 예시와 함께 정리하였다.
1. 곱셈과 나눗셈 최적화
비트 시프트는 2의 배수 단위로 곱하거나 나누는 연산을 빠르게 수행할 수 있다.
예시 1)
const num = 4;
console.log(num << 1); // 8 (곱하기 2)
console.log(num >> 1); // 2 (나누기 2)
2. 플래그 관리
비트 플래그를 사용해 상태를 관리할 때 유용하다.
예시 2)
const FLAG_READ = 1 << 0; // 0001
const FLAG_WRITE = 1 << 1; // 0010
const FLAG_EXECUTE = 1 << 2; // 0100
let permissions = FLAG_READ | FLAG_WRITE; // 읽기 + 쓰기 권한 -> 0011
console.log((permissions & FLAG_EXECUTE) !== 0); // false (실행 권한 없음)
3. 효율적인 데이터 압축 및 처리
비트를 사용해 다수의 값을 하나의 숫자로 압축하거나, 데이터를 효율적으로 저장할 수 있다.
주의사항
- 비트 연산은 32비트 정수로 동작한다. 자바스크립트에서 숫자는 기본적으로 64비트 부동소수점으로 표현되지만, 비트 연산을 수행할 때는 32비트 정수로 변환된다.
- 이동 횟수가 32를 초과하면 32로 나눈 나머지 값만 적용된다. 예를 들어, a << 33은 a << 1과 동일하게 동작한다.
비트 시프트 연산은 효율성과 직결되는 작업에서 특히 유용하다. 단, 비트를 직접 다루는 만큼 정확한 이해와 신중한 사용이 필요하다.
'⚙️ Node.js' 카테고리의 다른 글
[DiscordJS] Gateway Intent는 무엇일까? (0) | 2024.12.04 |
---|---|
[NodeJS] 엑셀의 차트, 함수, 그래프 유지하며 저장하기 with xlsx-populate (0) | 2024.10.04 |
[NodeJS] 아주 쉽게 타입스크립트 적용하기 (1) | 2024.09.05 |
[DiscordJS] 10분만에 디스코드 봇 제작하기 (14) | 2024.09.05 |
[NestJS] Async, 비동기로 인한 프로세스 중단 방지 (0) | 2024.08.21 |