我整理了一个运算符、关键字等列表,唯一不明白的是python中的>>或<<。
请解释>>和<<背后的数学原理。
谢谢你。
它们是按位移位运算符。在数学上,它们相当于将 ( <<
) 或 ( >>
) 除以 2 的右操作数的幂。
x << y
数学上等价于x * (2 ** y)
。x >> y
数学上等价于x / (2 ** y)
。它们通常在操作或检查位标志时使用 - 即一个数字,其真正含义是打开或关闭位而不是明显的数值,这对于表示紧凑中的一系列布尔值很有用方式。
在您的特定情况下,100 >> 5
与100 / (2 ** 5)
. 简化我们得到的幂运算符100 / 32
。此除法的结果是 3.125,但移位运算符仅适用于(默认情况下)整数,因此结果被截断。
(这些运算符实际上是作为一种将构成二进制数的 1 和 0 向左或向右移动的方式实现的,因此从数学的角度来看,硬件实际上并没有进行除法。但是,如果您有一个以 10 为底的数字“12345”和你把它右移两位数,去掉小数部分,你得到“123”。本质上,你将数字除以 10 的 2(或 100)的幂并向下舍入,这正是具有的效果>>
- 仅在以 2 为底,因为计算机使用以 2 为底的算术。)
要了解位移,最好查看二进制表示
>>> 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
。除法的分数被丢弃。
在您的情况下,这些是左右位移运算符。然而,python 像许多其他语言一样支持运算符重载,因此您可以将它们用于其他事情。在您的示例100
中以二进制表示,因为1100100
当您将其向右移动五位时是 is 11
,或以十为基数 3