Tra*_*ack 2 python bit-manipulation set bitwise-operators
我将值集存储为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
Run Code Online (Sandbox Code Playgroud)
或者,使用您的示例:
>>> b, a = 0b110, 0b1010
>>> b & ~a
4
>>> bin(_)
0b100
Run Code Online (Sandbox Code Playgroud)
您当然可以将其包装在一个函数中:
def bitsetdiff(b, a):
return b & ~a
Run Code Online (Sandbox Code Playgroud)
但是如果你要做很多这样的事情,并且按位运算对你来说并不自然,你可能想在 PyPI 中搜索bit set和bitset 的库,这会给你一个动作的对象就像一组布尔值,但存储为(并且可以有效地转换为)整数。
我选择intbitset是因为它看起来很有希望:
>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])
Run Code Online (Sandbox Code Playgroud)
就像使用集合一样。但我没有看到任何明显的方法来访问作为一个大整数的值。可能还有其他更适合您需求的库;我只在快速扫描后选择了一个。
不是在一个操作中,但你应该坚持位操作(不是+或-).如果你想要value1不在的位value2,普通的拼写方式就是
value1 & ~value2
Run Code Online (Sandbox Code Playgroud)
也就是说,value1与补充的交集value2(注意,有一元前缀运算符~,不是-).
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |