按位差的正确方法?(python 2.7)

2024-05-12 21:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

示例:

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

我想找到第一组中的值,而不是第二组中的值。如果我使用集合结构,我会取集合差。但我用的是整数。如果我试着做些改变,那就行不通了(应该是-4)。在

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


Tags: 方法程序利用示例数据结构二进制整数差异
2条回答

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

value1 & ~value2

也就是说,value1value2的补码的交集(注意这里的一元前缀运算符是~,而不是{})。在

集差B-A只是B与{}的补码的交集。在

而且,虽然没有位差分运算符,但是有位交集(&)和位补码(~)运算符。所以:

b_minus_a = b & ~a

或者,用你的例子:

^{pr2}$

当然,您可以将其归纳为一个函数:

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

但是,如果你要做很多这样的事情,而按位操作不是很自然,你可能需要在PyPI中搜索bit set和{a2}的库,这将给你一个类似于一组布尔值的对象,但是存储为(并且可以有效地转换为)一个整数。在

我选择^{}是因为它看起来很有前途:

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

就像用套路一样。但我看不出有什么明显的方法可以把这个值作为一个大整数来访问。可能还有其他库更适合您的需要;我只是在快速扫描后才选择了一个。在

相关问题 更多 >