2012-02-15 72 views
2

我給出了一個大整數a和一個(較小)整數n獲取整數的第n位精度

使用Python獲取a的二進制分解的第012位(從右邊)的最快方法是什麼? (我不想寫一個C撐着,只是普通的Python)。

+0

多大? – 2012-02-15 20:42:29

+0

@JohnMachin:'a'大約有1000位數字,'n'大約爲1000. – Randomblue 2012-02-15 22:26:50

回答

6

你問的最快方式,想必使用Python的現代版。現代版本的Python具有可變長度整數,傳統智慧不適用。轉移大量並不便宜。轉移1便宜。這裏有一些-mtimeit輸入和相應的輸出。首先是

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 

的縮寫如果not not(foo)怪胎你出去,或者你真的想要一個int答案,而不是bool,你可以使用1 if foo else 0;它只是稍微慢一些。

+0

不錯的觀察。只是爲了記錄,在Python 3.1中刪除了'long'和'int'的區別,直接的方法也是最快的(至少在我的機器上)。 – 2012-02-15 21:47:50

+0

@SvenMarnach:我用2.7,3.1和3.2得到了類似的結果......我今晚會做一個更全面的評估;必須立即趕走... – 2012-02-15 21:57:33

+0

完成[我的機器上的時間](https://gist.github.com/1839351)確實比我以前的評論暗示的更加有區別。 (我之前只做過一些測試,碰巧碰到那些直接進行得更快的測試。) – 2012-02-15 22:10:53

7

移位到最後的位置,屏蔽掉寄託都還有:

bit = (a >> n) & 1 

這假定位在平時的索引這樣,即至少顯著位爲0位

編輯:我不知道這是否是最快辦法做到這一點在你的Python版本,但至少它是最直前進的方式。根據您的Python版本以及an的特定值,可能會有更快的方法,如answer by John Machin中所示。

+0

-1什麼讓你覺得這是最快的方式,在「大」和「相對小」的定義下? – 2012-02-15 20:44:21

+1

@JohnMachin:我可以從這個問題和OP的其他問題中看到,用戶根本不知道*如何去做。我對這個問題的解釋是,「最快」也可能是「最簡單」或「最好」等等。在這種情況下,我會盡力幫助並解釋非常基礎。如果你真的認爲這個答案不是有用的,那麼我將不得不接受你的幫助理念與我的非常不同。 (我認爲你的答案和你閱讀這個問題的方式也是完全有效的。) – 2012-02-15 21:30:58

+1

直到你編輯你的答案(或者解釋你的「最快」的定義),我才能刪除投票。 – 2012-02-15 21:50:27

-1

用正開始在0:

(a >> n) & 1 
+0

這個答案比@SvenMarnach的等價和更詳細的答案遲了1分鐘。我建議刪除它。 – texnic 2018-01-14 14:39:40