适当的方式做按位差异? (python 2.7)

时间:2018-06-05 17:12:56

标签: python set bit-manipulation bitwise-operators

我将值集存储为python长整数,形式为不同的2 ** i和,因为python允许对它的整数进行按位运算。对于我的许多程序来说,这比使用数据结构要快得多。

我经常发现自己想要取两个按位值的差异。

示例:

让我们说我有两个值,用2和4表示。通过联合,它们形成一个集合,值为6.(110) 然后我有第二组,十进制值10(二进制1010),即2和8。

我想找到第一组中的值,而不是第二组中的值。如果我使用集结构,我会采取设置差异。但我使用的是整数。如果我尝试做差异,它就不会工作(这将是-4)。

截至目前,我发现自己正在做value1 - (value1& value2)。这需要两个单独的操作来找到差异。有没有办法可以利用python提供的功能在一次操作中快速完成,而不是两次?

2 个答案:

答案 0 :(得分:5)

不在一个操作中,但您应该坚持位操作(不是+-)。如果您希望value1中的位不在value2中,则通常的拼写方法是

value1 & ~value2

value1value2的补集的交集(请注意,一元前缀运算符为~,而不是-)。

答案 1 :(得分:3)

设置差异B-A只是BA的补充的交集。

并且,虽然没有按位差运算符,但是存在按位交叉(&)和按位补码(~)运算符。所以:

b_minus_a = b & ~a

或者,使用您的示例:

>>> b, a = 0b110, 0b1010
>>> b & ~a
4
>>> bin(_)
0b100

你当然可以把它包装成一个函数:

def bitsetdiff(b, a):
    return b & ~a

但是,如果您要做很​​多这样的事情,并且按位操作不会自然而然地发生在您身上,您可能希望在bit setbitsetintbitset,它将为您提供一个对象,其作用类似于一组布尔值,但存储为(并且可以有效地转换为整数)。

我选择了how to follow meta refreshes in Python,因为它看起来很有希望:

>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])

就像使用套装一样。但我没有看到任何明显的方法来将值作为一个大整数来访问。可能还有其他库可以更好地满足您的需求;我只是在快速扫描后选了一个。