python - 检查位掩码的特定位

标签 python numpy bit-manipulation bit bitmask

我正在 python 中使用Bitmasks。据我所知,这些是整数数组,当它们解压缩为二进制格式时,它们会告诉您数组中给定元素的 32 位中的哪一个被设置 (=1)。

我想知道检查数组的任何元素是否设置了 4 个特定位的最快方法。我不关心其余的。我已经尝试了以下解决方案,但它对于我的目的来说不够快:

def detect(bitmask, check=(18,22,23,24), bits=32):
    boolmask = np.zeros(len(bitmask), dtype=bool)
    for i, val in enumerate(bitmask):    
        bithost = np.zeros(bits, dtype='i1')
        masklist = list(bin(val)[2:])
        bithost[:len(masklist)] = np.flip(masklist,axis=0)
        if len(np.intersect1d(np.nonzero(bithost)[0] ,check)) != 0:
            boolmask[i] = True        
        else: 
            boolmask[i] = False
    if any(boolmask):
        print("There are some problems")
    else:
        print("It is clean")

例如,如果给定的位掩码包含整数24453656(二进制为1011101010010001000011000),函数检测的输出 将是“存在一些问题”,因为设置了第 22 位:

bit: ...  20, 21, 22, 23, 24,...  
mask: ... 0,  0,  1,  0,  0,...

关于如何提高性能有什么想法吗?

最佳答案

整数只不过是计算机中的位序列。

所以,如果你得到整数,假设:333 对于计算机来说是一个位序列 101001101。它不需要任何解包。它位。

因此,如果掩码也是整数,则不需要任何拆包,只需对其进行按位运算即可。检查wikipedia了解它们如何工作的详细信息。

为了检查整数 abc 中是否设置了任何位 xyz,您可以执行以下操作: (abc & xyz) > 0。如果您绝对需要检查掩码是否为位元组,则可以进行一些打包,如下所示:

def detect(bitmask,check=(18,22,23,24)):
    checkmask=sum(2**x for x in check)
    if (bitmask & checkmask) > 0:
        print "There are some problems"
    else:
        print "Everything OK"

请注意,位掩码以基于 0 的位索引开头。第一个位是位 0。

关于python - 检查位掩码的特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53724160/

相关文章:

python selenium send_key() 不起作用

java - 为什么 Jython Servlet post 请求中 fieldStorage 为空

python - 如何用递增的数字填充二维数组?

algorithm - 通过位运算符检查一个点是否在矩形内

python - 如何找到将 N 个观察值分配到 M 个组的最佳方法?

python - QtDesigner 预览与实际 GUI 不同

python - 从 numpy 数组中删除选择索引处的行

python - 如何使用 numpy.vectorize() 修复广播问题

bit-manipulation - 如何在未知大小的二进制数中将所有位设置为 '1'?

Android/SQLite - WHERE 子句上的位操作