我得到一个大整数a
和一个(相对较小的)整数n
。
使用Python获取n
二进制分解的a
位(右起)的最快方法是什么? (我不想写一个C插件,只是简单的Python。)
答案 0 :(得分:9)
将该位移到最后位置,屏蔽掉其他位置:
bit = (a >> n) & 1
这假定以通常的方式对位进行索引,即最低有效位为位0。
编辑:我不确定这是否是最快方式在您的Python版本中执行此操作,但至少它是最直接的方式。根据您的Python版本以及a
和n
的特定值,可能会有更快的方式,如answer by John Machin所示。
答案 1 :(得分: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
;它只是稍微慢了一点。