移位运算符(和)

Java 语言提供了三个运算符,用于在 32 位和 64 位整数值上执行按位移位。这些都是二元运算符,第一个操作数是要移位的值,第二个操作数表示移位多远。

  • <<左移位运算符将第一个操作数给定的值向左移动第二个操作数给出的位位置数。右端的空位置用零填充。

  • ‘>>‘或算术移位运算符将第一个操作数给出的值向右移动第二个操作数给出的位位数。通过复制最左边的位来填充左端的空位置。此过程称为符号扩展

  • ‘>>>‘或逻辑右移位运算符将第一个操作数给出的值向右移动第二个操作数给出的位位置数。左端的空位置用零填充。

笔记:

  1. 这些运算符需要 intlong 值作为第一个操作数,并产生与第一个操作数相同类型的值。 (在将转换结果分配给 byteshortchar 变量时,你需要使用显式类型转换。)

  2. 如果你使用一个第一个操作数为 bytecharshort 的 shift 操作符,它将被提升为 int 并且操作产生一个 int。)

  3. 第二个操作数以操作*的位数为模,*以给出移位量。有关 mod 数学概念的更多信息,请参见模数示例

  4. 通过操作从左端或右端移位的位被丢弃。 (Java 不提供原始的旋转运算符。)

  5. 算术移位运算符等效于将(二进制补码)数除以 2 的幂。

  6. 左移运算符相当于将(二进制补码)数乘以 2 的幂。

下表将帮助你了解三个班次运算符的效果。 (这些数字用二进制表示法表示,以帮助虚拟化。)

OPERAND1 操作数 << >> >>>
0b0000000000001011 0 0b0000000000001011 0b0000000000001011 0b0000000000001011
0b0000000000001011 1 0b0000000000010110 0b0000000000000101 0b0000000000000101
0b0000000000001011 2 0b0000000000101100 0b0000000000000010 0b0000000000000010
0b0000000000001011 28 0b1011000000000000 0b0000000000000000 0b0000000000000000
0b0000000000001011 31 0b1000000000000000 0b0000000000000000 0b0000000000000000
0b0000000000001011 32 0b0000000000001011 0b0000000000001011 0b0000000000001011
0b1000000000001011 0 0b1000000000001011 0b1000000000001011 0b1000000000001011
0b1000000000001011 1 0b0000000000010110 0b1100000000000101 0b0100000000000101
0b1000000000001011 2 0b0000000000101100 0b1110000000000010 0b00100000000000100
0b1000000000001011 31 0b1000000000000000 0b1111111111111111 0b0000000000000001

Bit 操作中有移位运算符的用户的例子