我刚刚通过 这个问题 发现了 Python 中的 按位补码一元运算,并一直在尝试为它提出一个实际的应用程序,如果不是,则确定重载运算符通常是否安全(通过覆盖 __invert__
方法)用于其他用途。问题中给出的示例失败了 TypeError
,并且提供的 链接 看起来非常吓人。这里有一些摆弄,看看 ~
在使用中:
from bitstring import BitArray
x = 7
print(~x)
# -8
print(BitArray(int=x, length=4).bin)
# '0111'
print(BitArray(int=~x, length=4).bin)
# '1000'
print(~~True, ~~False)
# 1 0
for i in range(-100, 100):
assert i + ~i == -1
assert i ^ ~i == -1
assert bool(i) == ~~bool(i)
是否有 任何 我应该注意的此运算符的有效用例示例?即使有,对于 int
以外的类型覆盖此运算符通常是否可以接受?
原文由 Alec 发布,翻译遵循 CC BY-SA 4.0 许可协议
按位非运算符的标准用例是按位运算,就像按位与
&
,按位或|
,按位异或^
, and bitfad-e60457移动<<
和>>
。尽管它们很少用于更高级别的应用程序,但有时您仍然需要进行按位操作,因此这就是它们存在的原因。当然,您可以为自定义类型覆盖这些,并且通常在这样做时不需要遵循任何特定的语义。只需选择对您的类型有意义的内容以及在某种程度上仍适合操作员的内容即可。
如果该操作晦涩难懂,用一两个词更好地解释,那么您应该改用标准方法。但是在某些情况下,尤其是在处理与数字相关的类型时,可能会有一些适合按位运算符的类似数学的运算,因此可以很好地使用它们。
就像你会覆盖标准运算符一样
+
和-
只是为了有意义的操作,你应该尝试对按位运算符做同样的事情。The reason
~~True, ~~False
gives you(1, 0)
is because thebool
type does not define its own__invert__
operation.但是,int
可以;和bool
实际上是int
的子类型。所以bool
实际上继承了所有按位和算术运算符的逻辑。这就是为什么True + True == 2
等等。