2024-09-19 20:15:08 发布
网友
我得到一个大整数a,和一个(相对较小的)整数n。在
a
n
使用Python获得n的二进制分解的第n位(从右边)的最快方法是什么?我不想写一个普通的Python插件(我不想写)
将位移到最后一个位置,遮住其他一切:
bit = (a >> n) & 1
这假设位以通常的方式索引,即最低有效位是位0。在
编辑:我不确定这是否是Python版本中最快的方法,但至少它是最直接的方法。根据Python版本和a和{}的特定值,可能有更快的方法,如answer by John Machin所示。在
您要求使用最快的方式,大概是使用现代版本的Python。现代版本的Python具有可变长度的int,而传统的智慧并不适用。转移大量数据并不便宜。换档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;它只是稍微慢一点。在
not not(foo)
int
bool
1 if foo else 0
将位移到最后一个位置,遮住其他一切:
这假设位以通常的方式索引,即最低有效位是位0。在
编辑:我不确定这是否是Python版本中最快的方法,但至少它是最直接的方法。根据Python版本和}的特定值,可能有更快的方法,如answer by John Machin所示。在
a
和{您要求使用最快的方式,大概是使用现代版本的Python。现代版本的Python具有可变长度的int,而传统的智慧并不适用。转移大量数据并不便宜。换档1很便宜。这里有一些-mtimeit输入和相应的输出。第一个是
如果
not not(foo)
吓到你了,或者你真的想要一个int
而不是bool
,你可以使用1 if foo else 0
;它只是稍微慢一点。在相关问题 更多 >
编程相关推荐