操作

有符号整型数算术右移时,(浮点数没有移位操作)

  • 所有位向右移动,丢弃移出的低位部分;
  • 最高位 补原符号位 。

这样,可以保证每右移一次,移动后的数为原数的二分之一向下取整。

原理

※ 若对补码表示法不熟悉,参见有符号整数的补码表示法。

设 位有符号数 的二进制为 ,按补码表示法展开,它的数值是

算术右移一位,设移位后的数值为 ,按同样的方法展开,有

把 除以 得到

而 可以拆成

其中 ,所以

对比 和 的表达式,差了一项 :

故

  • 当 时, 为偶数,则 为整数,故 为整数,且 ;
  • 当 时, 为奇数,则 形如 ,而 ,故 为整数,且 。

综上所述,有

为“向下取整”符号。

注意事项

这里容易和 C 语言的整数除法混淆(参见取模与整除的计算方法)。C 语言里 -3 / 2 的结果是 -1,因为它采用向零截断,把 截成 。而算术右移 -3 >> 1 的结果是 -2,采用向下取整。两者在运算符前的数为负数且不能整除时不同。