我刚刚发现了 bitwise complement unary operation在 Python 中通过 this question并且一直在尝试为它提出一个实际的应用程序,如果不是,则确定为其他用途重载运算符(通过覆盖 __invert__
方法)通常是否安全。问题中给出的示例因 TypeError
而失败,并且 link提供似乎很吓人。这里有一些摆弄以查看正在使用的 ~
:
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
以外的类型覆盖此运算符通常是否可以接受?
最佳答案
按位非运算符的标准用例是按位运算,就像按位与 &
, 按位或 |
, 按位异或 ^
, 和按位移位 <<
和 >>
.尽管它们很少用于更高级别的应用程序,但有时您仍然需要进行按位操作,这就是它们存在的原因。
当然,您可以为自定义类型覆盖这些,通常您不需要遵循任何特定的语义。只需选择对您的类型有意义的内容以及在某种程度上仍然适合运算符(operator)的内容。
如果操作晦涩难懂,用一两个词更好地解释,那么您应该改用标准方法。但在某些情况下,尤其是在处理与数字相关的类型时,可能会有一些适合按位运算符的类似数学的运算,因此可以很好地使用这些运算符。
就像您要覆盖 +
这样的标准运算符一样和 -
仅对有意义的操作,您应该尝试对按位运算符执行相同的操作。
原因~~True, ~~False
给你(1, 0)
是因为 bool
类型没有定义自己的 __invert__
手术。然而,int
做;和 bool
实际上是 int
的子类型.所以bool
实际上继承了所有位运算符和算术运算符的逻辑。这就是为什么 True + True == 2
等
关于python - '~'(波浪号)运算符在Python中的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271945/