Беззнаковый сдвиг вправо (>>>)
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 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
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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