【发布时间】:2018-12-11 12:23:00
【问题描述】:
我正在与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),则函数 detect 的输出将是“存在一些问题”,因为位 22已设置:
bit: ... 20, 21, 22, 23, 24,...
mask: ... 0, 0, 1, 0, 0,...
关于如何提高性能的任何想法?
【问题讨论】:
-
所以你要检查,如果对于给定的整数,你要检查的任何位被设置,如果其中任何一个被设置,你想说有问题吗?
-
是的,就是这样@Gnudiff。对不起,如果我的问题不够清楚。
-
在这种情况下我的答案应该是正确的
标签: python numpy bit-manipulation bit bitmask