我将值集存储为 python 长整数,以不同的 2**i 和的形式,因为 python 允许对它的整数进行按位运算。对于我的许多程序来说,这比使用数据结构要快得多。
我经常发现自己想要取两个按位值的差值。
例子:
假设我有两个值,分别用 2 和 4 表示。通过联合它们形成一个集合,即值 6。(110)
然后我有第二组十进制值 10(二进制 1010),即 2 和 8。
我想找到第一组中的值,而不是第二组中的值。如果我使用集合结构,我会采用集合差异。但我使用的是整数。如果我尝试做不同的事情,它将不起作用(它将是 -4)。
到目前为止,我发现自己在做 value1 - (value1&value2)。这需要两个单独的操作才能找到差异。有没有一种方法可以利用 python 提供的功能在一个操作而不是两个操作中快速执行此操作?
最佳答案
集合差 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
但是如果你要做很多这样的事情,并且按位运算对你来说不是很自然,你可能想在 PyPI 中搜索 bit set 和 bitset 的库,这会给你一个对象,就像一组 bool 值,但存储为(并且可以有效地转换为)整数。
我选择
intbitset
是因为它看起来很有希望:>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])
就像使用集合一样。但我没有看到任何明显的方法来访问作为一个大整数的值。可能还有其他更适合您需求的库;我只在快速扫描后选择了一个。
关于python - 按位差异的正确方法? ( python 2.7),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50705563/