2012-02-15 71 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