a = 100000000
c = (2**(a-1))-1
b = (2<<(a-1))-1
m = 1000000007
print b%m
print c%m
输出 :
494499947
247249973
我在 python 中使用 ** 和 << 运算符来查找将 2 的幂提高到一个非常大的数字。然而,类似的操作会产生不同的结果。只是好奇为什么?
结果不同,因为等效于2 ** n
is 1 << n
, not 2 << n
。
**
是指数运算符。<<
向左移动位。
由于二进制数的性质,永远向左移动位会使数字翻倍。因此,您可以将与 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
2**4 = 2^4 = 2*2*2*2
>>> 2**4
16
2<<4 = 左移 4 位:移位前,2 为二进制的 10;移位后,2 是二进制的 100000
>>> 2<<4
32
<<
运算符表示左移。它与二的幂不同,尽管它可以用来计算它。
举个例子:
0b10101 << 1 ==> 0b101010
0b1000 >> 1 ==> 0b100
0b10 << 2 ==> 0b1000
要使用左移运算来计算 2 的幂,您可以定义如下函数:
def poweroftwo(x):
return 1 << x