检查位掩码的特定位

JTM

我有工作Bitmaskspython据我所知,这些是整数数组,当它们解压缩为二进制格式时,它们会告诉您为数组中的给定元素设置了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")

例如,如果给定bitmask包含整数24453656 (1011101010010001000011000 in binary),则由于设置了位22 ,函数detect的输出将为“有一些问题”:

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

关于如何提高性能的任何想法?

古努迪夫

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

因此,如果得到整数,可以说:333这是计算机的位101001101的序列。它不需要任何拆包。位。

因此,如果掩码也是整数,则不需要任何拆包,只需对其进行按位运算即可。请查看维基百科,以了解有关其工作原理的详细信息。

为了检查是否有任何XYZ在整数ABC对位设置,你这样做:(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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章