为了账号安全,请及时绑定邮箱和手机立即绑定

检查位掩码的特定位

检查位掩码的特定位

德玛西亚99 2021-09-14 15:09:14
我有工作Bitmasks在python。据我所知,这些是整数数组,当它们被解压缩为二进制格式时,它们会告诉您为数组中的给定元素设置了 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 已设置:bit: ...  20, 21, 22, 23, 24,...  mask: ... 0,  0,  1,  0,  0,...关于如何提高性能的任何想法?
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

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


所以,如果你得到整数,让我们说: 333 它是一个比特序列 101001101 到计算机。它不需要任何解包到位。它是位。


因此,如果掩码也是整数,则不需要任何解包,只需对其应用按位运算即可。查看wikipedia以了解有关这些工作原理的详细信息。


为了检查是否有任何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。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号