Java 中的移位运算符

2025年4月11日 | 阅读 4 分钟

在 Java 中,移位运算符 是一种特殊类型的运算符,它们作用于数据的位。这些运算符用于根据所使用的移位运算符类型,将数字的位向左或向右移动。Java 中有三种类型的移位 运算符

  1. 有符号左移运算符 (<<)
  2. 有符号右移运算符 (>>)
  3. 无符号右移运算符 (>>>)

注意:Java 不支持无符号左移运算符 (<<< )。

运算符运算符名称用途描述
<<有符号左移运算符a<<b将第一个操作数向左移动第二个操作数指定的位数,从右侧移入 0。
>>有符号右移运算符a>>b将第一个操作数向右移动第二个操作数指定的位数,并丢弃移出的位。
>>>无符号右移运算符a>>>b将第一个操作数向右移动第二个操作数指定的位数,丢弃移出的位,并从左侧移入 0。

有符号左移运算符

有符号左移运算符是一种特殊的运算符,用于根据运算符后面的数字将表达式的位向左移动。

让我们通过一些示例来理解左移运算符的工作原理。

考虑 x = 5。

5 的二进制等价物是 0101。

Shift Operators in Java

假设语句如下

x<<4,令 y 为 4

Shift Operators in Java

让我们在 Java 程序中实现上述逻辑。

示例

编译并运行

输出

The value is: 80

有符号右移运算符

有符号右移运算符是一种特殊的运算符,用于根据运算符后面的数字将表达式的位向右移动。

让我们通过一些示例来理解右移运算符的工作原理。

考虑 x = 80。

80 的二进制等价物是 1010000。

Shift Operators in Java

假设语句如下

x>>4,令 y 为 4

Shift Operators in Java

让我们在 Java 程序中实现上述逻辑。

示例

编译并运行

输出

The right-shifted value is: 5

无符号右移运算符

无符号右移运算符是一种特殊的右移运算符,它不使用符号位来填充序列。无符号右移运算符始终用 0 填充序列。

让我们以右移运算符的相同示例来理解左移运算符的概念。

负数是其正数的 2's 补码。所以,

因此 x >>> 2 = 0000 0000 0000 0000 0000 0000 0000 1010

而 y >>> 2 = 0011 1111 1111 1111 1111 1111 1111 0110

示例

编译并运行

输出

The right sifted value of 40 by 5 is : 1
The right shifted value of -40 by 5 is : -2

注意:与无符号右移不同,Java 中没有“<<<”运算符,因为逻辑左移 (<<) 和算术左移 (<<<) 操作是相同的。

要记住的重要事项

  1. 左移 (<<) 乘以 2 的幂:向左移动 n 位 (x << n) 等效于将 x 乘以 2^n。例如:5 << 4 等于 5 * 2^4 = 80。
  2. 右移 (>>) 除以 2 的幂:向右移动 n 位 (x >> n) 等效于将 x 除以 2^n,同时保持符号不变。例如:80 >> 4 等于 80 / 2^4 = 5。
  3. 无符号右移 (>>>) 用零填充:与 >> 不同,>> 在负数时保留符号位,而 >>> 始终用零填充。
  4. 负数和 >>>:当对负数使用 >>> 时,Java 会用零填充最左边的位而不是进行符号扩展,从而显著改变结果。例如:-40 >>> 2 会得到一个很大的正数。