This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

오른쪽 시프트 (>>)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2015년 7월⁩.

오른쪽 시프트 (>>) 연산자는 첫 번째 피연산자의 이진 표현을 지정된 비트 수만큼 오른쪽으로 이동시킨 숫자나 BigInt를 반환합니다. 오른쪽으로 밀려나간 초과 비트들은 버려지고, 왼쪽 끝 비트의 복사본이 왼쪽에서부터 채워집니다. 이 연산은 "부호 전파 오른쪽 시프트" 또는 "산술적 오른쪽 시프트"라고도 불리는데, 그 이유는 결과값의 부호가 첫 번째 피연산자의 부호와 같기 때문입니다.

시도해 보기

const a = 5; //  00000000000000000000000000000101
const b = 2; //  00000000000000000000000000000010
const c = -5; //  11111111111111111111111111111011

console.log(a >> b); //  00000000000000000000000000000001
// Expected output: 1

console.log(c >> b); //  11111111111111111111111111111110
// Expected output: -2

구문

js
x >> y

설명

>> 연산자는 두 가지 타입의 피연산자에 대해 오버로드되어 있습니다. number와 BigInt. 숫자의 경우 연산 결과는 32비트 정수이며, BigInt의 경우 BigInt를 반환합니다. 이 연산자는 먼저 두 피연산자를 숫자형으로 강제 변환한 뒤, 각각의 타입을 검사합니다. 두 피연산자가 모두 BigInt가 되면 BigInt 우측 시프트를 수행하고, 그렇지 않으면 두 피연산자를 32비트 정수로 변환한 후 숫자 우측 시프트를 수행합니다. 한쪽은 BigInt로, 다른 한쪽은 number로 변환될 경우 TypeError가 발생합니다.

새로운 최상위 비트가 이전 최상위 비트와 같은 값을 가지므로, 부호 비트(최상위 비트)는 변경되지 않습니다. 따라서 "부호 전파"라는 이름이 붙었습니다.

이 연산자는 왼쪽 피연산자의 비트 표현을 2의 보수로 처리합니다. 10진수(기수 10) 숫자 9-9의 32비트 이진 표현을 고려합니다.

     9 (기수 10): 00000000000000000000000000001001 (기수 2)
    -9 (기수 10): 11111111111111111111111111110111 (기수 2)

음의 10진수 숫자 -9의 2의 보수 이진 표현은 그 반대 숫자인 9(00000000000000000000000000001001)의 모든 비트를 반전시키고 1을 더해 형성됩니다.

두 경우 모두 이진수의 부호는 가장 왼쪽 비트로 결정됩니다. 양의 10진수 숫자 9의 경우 이진 표현의 가장 왼쪽 비트는 0이고, 음의 10진수 숫자 -9의 경우 이진 표현의 가장 왼쪽 비트는 1입니다.

앞서 제시한 10진수(기수 10) 숫자 9-9의 이진 표현을 기준으로 합니다.

9 >> 2의 결과는 2:

     9 (기수 10): 00000000000000000000000000001001 (기수 2)
                  --------------------------------
9 >> 2 (기수 10): 00000000000000000000000000000010 (기수 2) = 2 (기수 10)

오른쪽 끝 두 비트 01가 밀려 나간 것을 확인할 수 있으며, 왼쪽에서 최상위 비트 0 두 개가 복사되어 들어온 것을 알 수 있습니다.

-9 >> 2의 결과는 -3:

     -9 (기수 10): 11111111111111111111111111110111 (기수 2)
                   --------------------------------
-9 >> 2 (기수 10): 11111111111111111111111111111101 (기수 2) = -3 (기수 10)

오른쪽 끝 두 비트 11가 밀려 나간 것을 확인할 수 있습니다. 그러나 최상위 비트를 보면, 이 경우 최상위 비트는 1입니다. 따라서 그 최상위 1 비트 두 개가 왼쪽에서 밀려 들어와 음수 부호가 유지됩니다.

이진 표현 11111111111111111111111111111101는 음의 10진수 숫자 -3과 같습니다. 모든 음수 정수는 2의 보수로 저장되며, 이 값은 양의 10진수 숫자 3(00000000000000000000000000000011)의 이진 표현을 모든 비트를 반전시키고 1을 더하여 계산할 수 있습니다.

만약 왼쪽 피연산자가 32비트를 초과하는 숫자라면, 최상위 비트가 버려집니다. 예를 들어, 다음과 같이 32비트를 초과하는 정수는 32비트 정수로 변환됩니다.

변환 전: 11100110111110100000000000000110000000000001
변환 후:             10100000000000000110000000000001

오른쪽 피연산자는 부호 없는 32비트 정수로 변환된 후 32로 나눈 나머지를 취하게 되므로, 실제 시프트 오프셋은 항상 0에서 31 사이의 양의 정수가 됩니다. 예를 들어, 100 >> 32100 >> 0과 같으며 결과는 100이 됩니다. 이는 32를 32로 나눈 나머지가 0이기 때문입니다.

경고 : 사람들이 숫자를 정수로 잘라내기 위해 >> 0을 사용하는 것을 볼 수 있습니다. 어떤 숫자 x를 0만큼 오른쪽 시프트하면 x가 32비트 정수로 변환되며, -2147483648에서 2147483647 범위를 벗어나는 숫자의 최상위 비트가 제거됩니다. 대신 Math.trunc()를 사용하세요.

BigInt의 경우 잘림이 없습니다. 개념적으로, 양의 BigInt는 무한히 많은 선행 0 비트를 가진 것으로 이해하고, 음의 BigInt는 무한히 많은 선행 1 비트를 가진 것으로 이해하면 됩니다.

예제

오른쪽 시프트 사용하기

js
9 >> 2; // 2
-9 >> 2; // -3

9n >> 2n; // 2n

명세서

Specification
ECMAScript® 2026 Language Specification
# sec-signed-right-shift-operator

브라우저 호환성

같이 보기