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的幂提升到非常大的数。但是,类似的操作会产生不同只是好奇为什么?
答案 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