Thanks to visit codestin.com
Credit goes to developer.mozilla.org

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

브라우저 호환성

같이 보기