Python中的(**)和(<<)有什么区别?

7
a = 100000000
c = (2**(a-1))-1
b = (2<<(a-1))-1
m = 1000000007
print b%m
print c%m

输出:

494499947
247249973

我在使用Python中的**和<<运算符来计算2的很大次幂,但是类似的操作却给出了不同的结果。只是好奇为什么会这样?

4个回答

12

** 是指数运算符。 << 向左位移位。

由于二进制数的特性,每次向左移位会使数字加倍。因此,您可以将相同的操作表示为2的移动次数减1次方:

>>> 1 << 1  # 00000001 becomes 0000010
2
>>> 1 << 2  # 00000001 becomes 0000100
4
>>> 1 << 15 # 000000000000001 becomes 1000000000000000
32768

指数运算符不仅适用于2的幂,还可用于其他数的幂:

>>> 3 ** 3
27

请注意,2 ** 1仍然是2,但向左移动一次(2 << 1)相当于2 ** 2

>>> 2 ** 1
2
>>> 2 << 1
4

12

结果不同是因为2 ** n的等价物是1 << n,而不是2 << n


1
尽管它等于2 << (n-1) - Jerfov2

7

2**4 = 2^4 = 2*2*2*2

>>> 2**4 
16

2<<4 = 左移 4 位: 左移前,2 的二进制表示为10;左移后,2 的二进制表示为100000

>>> 2<<4 
32

1
2**4 // 2^4 输出的是12,我想你是想用#而不是// :)
- alko

0

<< 运算符表示左移。它不同于二的幂,尽管可以用它来计算。

例如:

0b10101 << 1 ==> 0b101010
0b1000  >> 1 ==> 0b100
0b10    << 2 ==> 0b1000

要使用左移操作符来计算二的幂,您可以定义一个如下的函数:

def poweroftwo(x):
    return 1 << x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接