Spec-Zone.ru › JavaScript

Беззнаковый сдвиг вправо (>>>)

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.

Оператор беззнакового сдвига вправо (>>>) возвращает число, двоичное представление которого получается путем сдвига первого операнда на указанное количество бит вправо. Избыточные биты, сдвинутые вправо, отбрасываются, а слева вставляются нулевые биты. Эта операция также называется "сдвиг вправо с заполнением нулями", поскольку знаковый бит становится 0, поэтому результирующее число всегда положительное. Беззнаковый сдвиг вправо не принимает значения 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); //  00111111111111111111111111111110
// Expected output: 1073741822

Синтаксис

x >>> y

Описание

В отличие от других арифметических и побитовых операторов, оператор беззнакового сдвига вправо не принимает значения BigInt. Это связано с тем, что он заполняет самые левые биты нулями, но концептуально BigInt имеют бесконечное количество ведущих знаковых битов, поэтому нет "самого левого бита" для заполнения нулями.

Оператор работает с двоичным представлением левого операнда в дополнительном коде. Рассмотрим 32-битные двоичные представления десятичных (основание 10) чисел 9 и -9:

     9 (base 10): 00000000000000000000000000001001 (base 2)
    -9 (base 10): 11111111111111111111111111110111 (base 2)

Двоичное представление отрицательного десятичного (основание 10) числа -9 в дополнительном коде формируется путем инвертирования всех битов его противоположного числа, которое в двоичном виде равно 9 и 00000000000000000000000000001001, и добавлением 1.

В обоих случаях знак двоичного числа определяется его крайним левым битом: для положительного десятичного числа 9 крайний левый бит двоичного представления равен 0, а для отрицательного десятичного числа -9 крайний левый бит двоичного представления равен 1.

Учитывая эти двоичные представления десятичных (основание 10) чисел 9 и -9:

Для положительного числа 9, беззнаковый сдвиг вправо и знаковый сдвиг вправо дают одинаковый результат: 9 >>> 2 дает 2, что то же самое, что и 9 >> 2:

      9 (base 10): 00000000000000000000000000001001 (base 2)
                   --------------------------------
9 >>  2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

Обратите внимание, что два крайних правых бита, 01, были сдвинуты, а два нуля были вставлены слева.

Однако посмотрите, что происходит для -9: -9 >> 2 (знаковый сдвиг вправо) дает -3, а -9 >>> 2 (беззнаковый сдвиг вправо) дает 1073741821:

      -9 (base 10): 11111111111111111111111111110111 (base 2)
                    --------------------------------
-9 >>  2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)

Обратите внимание, что два крайних правых бита, 11, были сдвинуты. Для -9 >> 2 (знаковый сдвиг вправо) два экземпляра крайнего левого 1 бита были вставлены слева, что сохранило отрицательный знак. С другой стороны, для -9 >>> 2 (беззнаковый сдвиг вправо) вместо этого были вставлены нули слева, поэтому отрицательный знак числа не сохраняется, и в результате получается (большое) положительное число.

Если левый операнд является числом с более чем 32 битами, его старшие биты будут отброшены. Например, следующий целый тип с более чем 32 битами будет преобразован в 32-битное целое число:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

Правый операнд будет преобразован в 32-битное беззнаковое целое число, а затем взято по модулю 32, поэтому фактический сдвиг всегда будет положительным целым числом от 0 до 31 включительно. Например, 100 >>> 32 — это то же самое, что и 100 >>> 0 (и дает 100), потому что 32 по модулю 32 равно 0.

Примеры

Использование беззнакового сдвига вправо

9 >>> 2; // 2
-9 >>> 2; // 1073741821

Беззнаковый сдвиг вправо не работает с BigInt.

9n >>> 2n; // TypeError: BigInts have no unsigned right shift, use >> instead

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-unsigned-right-shift-operator

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
unsigned_right_shift
1
12
1
3
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Побитовые операторы в руководстве по JS
  • Присваивание беззнакового сдвига вправо (>>>=)

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API