python - '~'(波浪号)运算符在Python中的应用

标签 python python-3.x operator-overloading bit-manipulation tilde

我刚刚发现了 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/

相关文章:

python - 确定 Shapely 点是否位于 LineString/MultiLineString 内

python - Django admin.site.register 为模型类抛出 TypeError

python - 无法从我的脚本中消除硬编码延迟以获得准确的结果

python - 使用 LXML 编写 XML header

python - 如何在 Python 中使用日期时间和 scipy 峰值进行绘图?

python - Win7 上的 Python 中即使没有使用大型数据结构,也会消耗超过 7 GB 内存的错误

python - Sprite 不会出现

c++ - 无法将 int 类型转换为时间类型(我的类(class)类型)

c++矩阵重载不起作用

c++ - 继承自 std::string 或运算符重载