Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. 表达式和运算符
  5. 右移(>>)

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways 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 类型。右边移出位被丢弃,左边移出的空位补符号位(最左边那位)。该操作也称为“符号位传播右移”(sign-propagating right shift)或“算术右移”(arithmetic right shift),因为返回值的符号位与第一个操作数的符号位相同。

尝试一下

const a = 5; //  00000000000000000000000000000101const b = 2; //  00000000000000000000000000000010const c = -5; //  11111111111111111111111111111011console.log(a >> b); //  00000000000000000000000000000001// Expected output: 1console.log(c >> b); //  11111111111111111111111111111110// Expected output: -2

语法

js
x >> y

描述

>> 运算符针对这两种操作数的类型进行了重载:数值和BigInt。对于数值,该运算符返回一个 32 位整数;对于 BigInt 类型,该运算符返回一个 BigInt。右移运算符首先将两个操作数强制转换为数值并测试它们的类型。如果两个操作数都转换成 BigInt,则执行 BigInt 右移;否则,它将两个操作数都转换为32 位整数并执行数值右移。如果一个操作数变为 BigInt 而另一个变为数值,则会抛出TypeError

由于新的数字最左边位与之前数字的最左边位是相同值,故符号位(最左边的位)不会改变,因此被称为“符号位传播”(sign-propagating)。

运算符以二进制补码的形式对左操作数进行运算。考虑十进制(以 10 为底)数字9-932 位二进制表示:

js
     9 (十进制): 00000000000000000000000000001001 (二进制)    -9 (十进制): 11111111111111111111111111110111 (二进制)

十进制(以 10 为底)负数-9 的二进制补码表示是将其相反数(即9)的二进制表示00000000000000000000000000001001 的所有位取反,再加1

这两个数的二进制表示的符号位由其最左边的位决定:对于十进制正数9,二进制表示的最左边位为0,对于十进制负数-9,二进制表示的最左边位是1

给定十进制(以 10 为底)数9-9 的二进制表示:

9 >> 2 得到2

js
     9 (十进制): 00000000000000000000000000001001 (二进制)                  --------------------------------9 >> 2 (十进制): 00000000000000000000000000000010 (二进制) = 2 (十进制)

请注意最右边的01 是如何移出的,最左边的00 是如何从左边移入的。

-9 >> 2 得到-3

js
     -9 (十进制): 11111111111111111111111111110111 (二进制)                   ---------------------------------9 >> 2 (十进制): 11111111111111111111111111111101 (二进制) = -3 (十进制)

请注意最右边的11 是如何移出的。但最左边的位情况稍有不同:由于-9 是负数,它的符号位(即最左边的位)是1,因此右移 2 位时会在最左边补上11,这便保留了负号。

二进制表示11111111111111111111111111111101 等于十进制(以 10 为底)负数-3,因为所有负整数都以二进制补码的形式存储,而-3 的二进制补码可以通过将十进制(以 10 为底)正数3 的二进制表示(即00000000000000000000000000000011)的所有位先取反,然后加1

如果左操作数是一个超过 32 位的数字,则会丢弃最高有效位。例如,以下超过 32 位的整数将被转换为 32 位整数:

丢弃前:11100110111110100000000000000110000000000001丢弃后:            10100000000000000110000000000001

右操作数将被转换为无符号 32 位整数,然后取模 32,因此实际移位偏移量将始终是 0 到 31 之间的正整数,包括 0 和 31。例如,100 >> 32100 >> 0 相同(结果都是100),因为 32 模 32 为 0。

BigInt 在使用右移时不会产生截断现象。从概念上讲,正 BigInt 具有无限数量的前导位0,而负 BigInt 具有无限数量的前导位1

将任何数字x 右移0 可以将x 转换为 32 位整数。不要使用>> 0 将数字截断为整数;使用Math.trunc() 代替。

示例

使用右移操作

js
9 >> 2; //  2-9 >> 2; // -39n >> 2n; // 2n

规范

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

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp