python中的(**)和(<<)之间有什么区别?

时间:2013-11-09 20:50:09

标签: python bit-shift exponent

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

输出:

494499947
247249973

我正在使用**和&lt;&lt; python中的运算符,可以将2的幂提升到非常大的数。但是,类似的操作会产生不同只是好奇为什么?

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

由于二进制数的性质,左边的步进位移使数字加倍。因此,您可以将相同的操作表示为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 << 1)相当于2 ** 2

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

答案 2 :(得分:7)

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

>>> 2**4 
16

2&lt;&lt;&lt;&lt;&lt;&lt;&lt; 4&gt;左移4位: 在班次之前,2是二进制的10;移位后,2是二进制的100000

>>> 2<<4 
32

答案 3 :(得分:0)

<<运算符表示左移。它与2的幂不同,虽然它可用于计算它。

举个例子:

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

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

def poweroftwo(x):
    return 1 << x