Har*_*hit 4 python bit-shift exponent
a = 100000000
c = (2**(a-1))-1
b = (2<<(a-1))-1
m = 1000000007
print b%m
print c%m
Run Code Online (Sandbox Code Playgroud)
输出:
494499947
247249973
Run Code Online (Sandbox Code Playgroud)
我在python中使用**和<<运算符来查找非常大的2的幂.但是,类似的操作会产生不同 只是好奇为什么?
**是指数运算符.<<将位移到左侧.
由于二进制数的性质,左边的步进位移使数字加倍.因此,您可以将2的相同操作表示为电源数减去1:
>>> 1 << 1 # 00000001 becomes 0000010
2
>>> 1 << 2 # 00000001 becomes 0000100
4
>>> 1 << 15 # 000000000000001 becomes 1000000000000000
32768
Run Code Online (Sandbox Code Playgroud)
指数运算符用于生成多于2的指数,但是:
>>> 3 ** 3
27
Run Code Online (Sandbox Code Playgroud)
但请注意,2 ** 1它仍然是两个,但向左移动一次(2 << 1)相当于2 ** 2:
>>> 2 ** 1
2
>>> 2 << 1
4
Run Code Online (Sandbox Code Playgroud)
2**4 = 2 ^ 4 = 2*2*2*2
>>> 2**4
16
Run Code Online (Sandbox Code Playgroud)
2 << 4 =左移4位:移位前,2是二进制10; 移位后,2是二进制的100000
>>> 2<<4
32
Run Code Online (Sandbox Code Playgroud)