Python中最低有效位的返回索引

2024-09-28 19:27:08 发布

您现在位置:Python中文网/ 问答频道 /正文

C++有一组函数,FFSH()、FFSL()和FFSLL(),返回给定二进制整数中设置的最低有效位。

我想知道Python中是否已经有了一个等价的函数。我没有看到一个被描述为bitarray,但也许还有另一个。我希望通过遍历所有可能的位掩码来避免计算答案,当然这是最后的选择;ffs()只返回一个整数,我想知道Python中的一些可比性。


Tags: 函数答案二进制整数bitarray等价掩码ffs
3条回答

它位于GNU多精度库的gmpy包装器中。在我的系统上,它比ctypes解决方案快4倍。

>>> import gmpy
>>> gmpy.scan1(136)
3
>>> bin(136)
'0b10001000'

可以使用ctypes模块从共享库(Windows用户的dll)加载函数。我能够从C标准库加载ffs()函数,该函数包含在Ubuntu 10.10的libc.so.6中:

>>> import ctypes
>>> libc = ctypes.cdll.LoadLibrary('libc.so.6')
>>> libc.ffs(136)
4

(注意,这使用基于1的索引)。显然,这与当前的跨平台不兼容;您需要根据正在运行的系统(从sys.platform或类似位置检测到)更改要加载的库的文件名。我甚至不能百分之百确定在不同的Linux发行版上会是相同的。

它也值得做一些适当的基准测试,看看它是否真的值得。如果经常调用它,但如果只是偶尔使用,那么与维护相比,Python实现的性能优势可能微不足道,以确保它在不同的平台上继续工作。

另一种选择是用C编写自己的函数实现,并给出一个Python包装器。然后你必须为你想要的每一个平台编译它,但是在保持速度优势的同时,你就省去了寻找正确库名的麻烦。

仅在Python2.7和3.1及以上:

def ffs(x):
    """Returns the index, counting from 0, of the
    least significant set bit in `x`.
    """
    return (x&-x).bit_length()-1

示例:

>>> ffs(136)
3

相关问题 更多 >