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的移动次数减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
结果不同是因为2 ** n
的等价物是1 << n
,而不是2 << n
。
2**4 = 2^4 = 2*2*2*2
>>> 2**4
16
2<<4 = 左移 4 位: 左移前,2 的二进制表示为10;左移后,2 的二进制表示为100000
>>> 2<<4
32
- alko2**4 // 2^4 输出的是12,我想你是想用#
而不是//
:)
<<
运算符表示左移。它不同于二的幂,尽管可以用它来计算。
例如:
0b10101 << 1 ==> 0b101010
0b1000 >> 1 ==> 0b100
0b10 << 2 ==> 0b1000
要使用左移操作符来计算二的幂,您可以定义一个如下的函数:
def poweroftwo(x):
return 1 << x
2 << (n-1)
- Jerfov2