做位差的正确方法? (python 2.7)
Proper way to do bitwise difference? (python 2.7)
我将值集存储为 python 长整数,以不同的 2**i 和的形式存储,因为 python 允许对其整数进行按位运算。对于我的许多程序,这比使用数据结构要快得多。
我经常发现自己想要取两个按位值的差值。
示例:
假设我有两个值,用 2 和 4 表示。通过并集它们形成一个集合,值 6。(110)
然后我有第二组,十进制值 10(二进制 1010),即 2 和 8。
我想找到第一组中的值,而不是第二组中的值。如果我使用集合结构,我会采用集合差异。但我使用的是整数。如果我尝试做差异,它不会起作用(它会是 -4)。
截至目前,我发现自己在做 value1 - (value1&value2)。这需要两个单独的操作来找出差异。有没有一种方法可以利用 python 提供的功能在一次操作中而不是两次快速完成此操作?
不是一次操作,但你应该坚持位操作(不是+
或-
)。如果你想要 value1
中的位而不是 value2
中的位,通常的拼写方式是
value1 & ~value2
即value1
与value2
的补集的交集(注意这里的一元前缀运算符是~
,不是-
)。
集差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 and bitset 的库,这将给你一个对象,它的作用类似于一组布尔值,但存储为整数(并且可以有效地转换为整数和从整数转换)。
我选择了intbitset
,因为它看起来很有前途:
>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])
就像使用套装一样。但是我没有看到任何明显的方法来访问作为一个大整数的值。可能还有其他库更适合您的需求;快速浏览后我只选了一个。
我将值集存储为 python 长整数,以不同的 2**i 和的形式存储,因为 python 允许对其整数进行按位运算。对于我的许多程序,这比使用数据结构要快得多。
我经常发现自己想要取两个按位值的差值。
示例:
假设我有两个值,用 2 和 4 表示。通过并集它们形成一个集合,值 6。(110) 然后我有第二组,十进制值 10(二进制 1010),即 2 和 8。
我想找到第一组中的值,而不是第二组中的值。如果我使用集合结构,我会采用集合差异。但我使用的是整数。如果我尝试做差异,它不会起作用(它会是 -4)。
截至目前,我发现自己在做 value1 - (value1&value2)。这需要两个单独的操作来找出差异。有没有一种方法可以利用 python 提供的功能在一次操作中而不是两次快速完成此操作?
不是一次操作,但你应该坚持位操作(不是+
或-
)。如果你想要 value1
中的位而不是 value2
中的位,通常的拼写方式是
value1 & ~value2
即value1
与value2
的补集的交集(注意这里的一元前缀运算符是~
,不是-
)。
集差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 and bitset 的库,这将给你一个对象,它的作用类似于一组布尔值,但存储为整数(并且可以有效地转换为整数和从整数转换)。
我选择了intbitset
,因为它看起来很有前途:
>>> b = intbitset([2, 4])
>>> a = intbitset([2, 8])
>>> b - a
intbitset([4])
就像使用套装一样。但是我没有看到任何明显的方法来访问作为一个大整数的值。可能还有其他库更适合您的需求;快速浏览后我只选了一个。