5
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

4 回答 4

11

结果不同,因为等效于2 ** nis 1 << n, not 2 << n

于 2013-11-09T20:56:17.153 回答
10

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

由于二进制数的性质,永远向左移动位会使数字翻倍。因此,您可以将与 2 相同的运算表示为移位次数减一的幂:

>>> 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
于 2013-11-09T20:53:53.820 回答
7

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

>>> 2**4 
16

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

>>> 2<<4 
32
于 2013-11-09T20:54:47.680 回答
0

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

举个例子:

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

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

def poweroftwo(x):
    return 1 << x
于 2013-11-09T20:58:49.237 回答