移位运算符

按位移位可以被认为是向左或向右移动位,因此改变了操作数据的值。

左移

左移位运算符 (value) << (shift amount) 将位移位 (shift amount) 位; 从右边进来的新位将是 0 的:

5 << 2 => 20
//  5:      0..000101
// 20:      0..010100 <= adds two 0's to the right

右移( 符号传播

右移运算符 (value) >> (shift amount) 也称为符号传播右移,因为它保留了初始操作数的符号。右移操作符将 value 指定的 shift amount 位向右移动。从右侧移出的多余位被丢弃。从左侧进入的新位将基于初始操作数的符号。如果最左边的位是 1 那么新的位将全部为 1,而反之亦然 0

20 >> 2 => 5
// 20:      0..010100
//  5:      0..000101 <= added two 0's from the left and chopped off 00 from the right

-5 >> 3 => -1
// -5:      1..111011
// -2:      1..111111 <= added three 1's from the left and chopped off 011 from the right

右移( 零填充

零填充右移运算符 (value) >>> (shift amount) 将向右移动位,新位将为 00 从左侧移入,向右的多余位移出并丢弃。这意味着它可以将负数转化为正数。

-30 >>> 2 => 1073741816
//       -30:      111..1100010
//1073741816:      001..1111000

对于非负数,零填充右移和符号传播右移产生相同的结果。