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 進数の性質上、常にビットを左にシフトすると数値が 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 ですが、左に 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 は 2 進数で 10 です。シフト後、2 はバイナリで 100000 です

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

<<演算子は左シフトを意味します。計算には使用できますが、2 の累乗と同じではありません。

例として:

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

左シフト操作を使用して 2 の累乗を計算するには、次のような関数を定義できます。

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