检查位掩码的特定位
Checking specific bits of a 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")
例如,如果给定的 bitmask
包含整数 24453656 (1011101010010001000011000 in binary)
,函数 detect[=27= 的输出] 将是 "There are some problems" 因为第 22 位已设置:
bit: ... 20, 21, 22, 23, 24,...
mask: ... 0, 0, 1, 0, 0,...
关于如何提高性能有什么想法吗?
我不确定你的 bitmask
论点是什么。不管怎样,你应该使用按位运算符。
像这样制作位掩码:
def turn_bits_on(bits):
n = 0
for k in bits:
n = (n | (1 << (k - 1))) if k > 0 else n
return n
bits_to_check = turn_bits_on([18, 22, 23, 24])
然后,对于单个数字,您可以检测:
def is_ok(value, mask):
return not (value & mask)
print(is_ok(24453656, bits_to_check))
最后,根据您的 bitmask
值(列表、DataFrame 等),将 is_ok()
函数应用于每个值。
希望对您有所帮助!
整数只不过是计算机中的位序列。
因此,如果您得到整数,假设: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.
我在 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")
例如,如果给定的 bitmask
包含整数 24453656 (1011101010010001000011000 in binary)
,函数 detect[=27= 的输出] 将是 "There are some problems" 因为第 22 位已设置:
bit: ... 20, 21, 22, 23, 24,...
mask: ... 0, 0, 1, 0, 0,...
关于如何提高性能有什么想法吗?
我不确定你的 bitmask
论点是什么。不管怎样,你应该使用按位运算符。
像这样制作位掩码:
def turn_bits_on(bits):
n = 0
for k in bits:
n = (n | (1 << (k - 1))) if k > 0 else n
return n
bits_to_check = turn_bits_on([18, 22, 23, 24])
然后,对于单个数字,您可以检测:
def is_ok(value, mask):
return not (value & mask)
print(is_ok(24453656, bits_to_check))
最后,根据您的 bitmask
值(列表、DataFrame 等),将 is_ok()
函数应用于每个值。
希望对您有所帮助!
整数只不过是计算机中的位序列。
因此,如果您得到整数,假设: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.