我将值集存储为python长整数,形式为不同的2 ** i和,因为python允许对它的整数进行按位运算。对于我的许多程序来说,这比使用数据结构要快得多。
我经常发现自己想要取两个按位值的差异。
示例:
让我们说我有两个值,用2和4表示。通过联合,它们形成一个集合,值为6.(110) 然后我有第二组,十进制值10(二进制1010),即2和8。
我想找到第一组中的值,而不是第二组中的值。如果我使用集结构,我会采取设置差异。但我使用的是整数。如果我尝试做差异,它就不会工作(这将是-4)。
截至目前,我发现自己正在做value1 - (value1& value2)。这需要两个单独的操作来找到差异。有没有办法可以利用python提供的功能在一次操作中快速完成,而不是两次?
答案 0 :(得分:5)
不在一个操作中,但您应该坚持位操作(不是+
或-
)。如果您希望value1
中的位不在value2
中,则通常的拼写方法是
value1 & ~value2
即value1
与value2
的补集的交集(请注意,一元前缀运算符为~
,而不是-
)。
答案 1 :(得分:3)
设置差异B-A
只是B
与A
的补充的交集。
并且,虽然没有按位差运算符,但是存在按位交叉(&
)和按位补码(~
)运算符。所以:
b_minus_a = b & ~a
或者,使用您的示例:
>>> b, a = 0b110, 0b1010
>>> b & ~a
4
>>> bin(_)
0b100
你当然可以把它包装成一个函数:
def bitsetdiff(b, a):
return b & ~a
但是,如果您要做很多这样的事情,并且按位操作不会自然而然地发生在您身上,您可能希望在bit set和bitset和intbitset
,它将为您提供一个对象,其作用类似于一组布尔值,但存储为(并且可以有效地转换为整数)。
我选择了how to follow meta refreshes in Python,因为它看起来很有希望:
>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])
就像使用套装一样。但我没有看到任何明显的方法来将值作为一个大整数来访问。可能还有其他库可以更好地满足您的需求;我只是在快速扫描后选了一个。