0

我整理了一个运算符、关键字等列表,唯一不明白的是python中的>>或<<。

请解释>>和<<背后的数学原理。

谢谢你。

4

3 回答 3

11

它们是按位移位运算符。在数学上,它们相当于将 ( <<) 或 ( >>) 除以 2 的右操作数的幂。

  • x << y数学上等价于x * (2 ** y)
  • x >> y数学上等价于x / (2 ** y)

它们通常在操作或检查位标志时使用 - 即一个数字,其真正含义是打开或关闭位而不是明显的数值,这对于表示紧凑中的一系列布尔值很有用方式。

在您的特定情况下,100 >> 5100 / (2 ** 5). 简化我们得到的幂运算符100 / 32。此除法的结果是 3.125,但移位运算符仅适用于(默认情况下)整数,因此结果被截断。

(这些运算符实际上是作为一种将构成二进制数的 1 和 0 向左或向右移动的方式实现的,因此从数学的角度来看,硬件实际上并没有进行除法。但是,如果您有一个以 10 为底的数字“12345”和你把它右移两位数,去掉小数部分,你得到“123”。本质上,你将数字除以 10 的 2(或 100)的幂并向下舍入,这正是具有的效果>>- 仅在以 2 为底,因为计算机使用以 2 为底的算术。)

于 2013-05-23T21:49:06.407 回答
4

要了解位移,最好查看二进制表示

>>> bin(100)
'0b1100100'
>>> bin(100>>1)
'0b110010'
>>> bin(100>>2)
'0b11001'
>>> bin(100>>3)
'0b1100'
>>> bin(100>>4)
'0b110'
>>> bin(100>>5)
'0b11'
>>> bin(3)
'0b11'
>>> bin(100>>5) == bin(3)
True

当您不考虑二进制时,<< n与乘以相同2**n>> n与除以相同2**n。除法的分数被丢弃。

于 2013-05-23T22:58:23.533 回答
3

在您的情况下,这些是左右位移运算符。然而,python 像许多其他语言一样支持运算符重载,因此您可以将它们用于其他事情。在您的示例100中以二进制表示,因为1100100当您将其向右移动五位时是 is 11,或以十为基数 3

于 2013-05-23T21:50:34.553 回答