2012-02-15 13 views
2

大きな整数aと(比較的小さい)整数nが与えられています。整数のn番目のビット精度を得る

aのバイナリ分解のnビット(右から)をPythonで取得する最も速い方法は何ですか? 、

+0

大きさはどれくらい大きいですか? –

+0

@ JohnMachin: 'a'は約1000桁、' n'は約1000です。 – Randomblue

答えて

6

。現代版のPythonは可変長整数を持ち、従来の知恵は適用されません。大きな数字をシフトすることは安くはありません。シフト1は安いです。いくつかの-mtimeit入力とそれに対応する出力があります。 not not(foo)フリークあなたを、またはあなたが本当に代わりboolint答えは、あなたが1 if foo else 0を使用することができますしたい場合は、最初は

windows command prompt>\python27\python -mtimeit -s"a=10**20;n=3" "(a>>n)&1" 
1000000 loops, best of 3: 0.238 usec per loop 

-s"a=10**20;n=3" "(a>>n)&1" 
0.238 usec 

-s"a=10**20;n=3" "not not(a & (1 << n))" 
0.154 usec 

-s"a=10**200;n=3" "(a>>n)&1" 
0.382 usec 

-s"a=10**200;n=3" "not not(a & (1 << n))" 
0.155 usec 

-s"a=10**10;n=3" "(a>>n)&1" 
0.231 usec 

-s"a=10**10;n=3" "not not(a & (1 << n))" 
0.156 usec 

-s"a=10**9;n=3" "(a>>n)&1" 
0.0801 usec 

-s"a=10**9;n=3" "not not(a & (1 << n))" 
0.0938 usec 

-s"a=2**1000;n=64" "(a>>n)&1" 
0.446 usec 

-s"a=2**1000;n=64" "not not(a & (1 << n))" 
0.255 usec 

の略語です。わずかに遅いです。

+0

良い観察。記録のために、Python 3.1では 'long'と' int'を区別していますが、まっすぐなアプローチも(少なくとも私のマシンでは)最も速いです。 –

+0

@SvenMarnach:私は2.7,3.1、そして3.2で似たような結果を得ています...今晩完全な評価を行います。今すぐ急ぐ必要があります... –

+0

私のマシン上のタイミング[https://gist.github.com/1839351]は、私の前のコメントが示唆しているものよりも本当に差別化されています。 (私は前にあなたのテストの一部しかやっておらず、まっすぐなアプローチが速いものを打ちました。) –

7

シフト最後の位置にビットを(私はCのpluggin、単なるPythonのを書きたくない)他のeverthingマスクアウト:

bit = (a >> n) & 1 

これは、ビットは、通常でインデックス化されていることを前提とし方法は、最下位ビット、すなわち、あるビット0

編集:私はこれは、Pythonのバージョンでそれを行うには最速方法があるかどうかわからないんだけど、少なくともそれが最も直です前方へ。 Pythonのバージョンと特定の値anに応じて、answer by John Machinに示すように、より高速な方法があるかもしれません。

+0

-1「大」と「比較的小さい」の定義のなかで、これが最も速い方法であるという印象を与えますか? –

+1

@ジョンマーチン:私は、この質問と、OPによる他の質問から、ユーザーがその方法を全く知らなかったことを知ることができました。質問の私の解釈は、 "最も速い"だけでなく、 "最も簡単な"または "最高の"何かをすることができます。そのような場合、私は助けになり、非常に基本的なことを説明しようとします。この回答が役に立たないと本当に思っているのであれば、あなたの有益性の概念は私のものとは非常に異なると受け入れなければなりません。 (私はあなたの答えと質問を読むあなたの方法は完全に有効であると思う) –

+1

答えを編集するまで(おそらく "最速"の定義を説明するために)、投票を取り除くことはできません。 –

-1

使用nは0から始まる:あなたは、おそらくのPythonの現代版を使用して、最速道を尋ね

(a >> n) & 1 
+0

この回答は、@SvenMarnachの同等で詳細なものより1分遅れて与えられました。私はそれを取り除くことを提案する。 – texnic

関連する問題