我刚刚通过this question在Python中发现了bitwise complement unary operation,并一直在try 为它设计一个实际的应用程序,如果没有,则确定重载操作符(通过重写__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)

对于这个操作符,有any个我应该知道的有效用例的例子吗?即使存在,对于int以外的类型,是否通常可以覆盖此运算符?

推荐答案

按位NOT运算符的标准用例是按位操作,就像按位AND &、按位OR |、按位XOR ^以及按位移位<<>>一样.尽管它们很少在更高级别的应用程序中使用,但仍有一些时候需要进行逐位操作,这就是它们存在的原因.

当然,您可以为自定义类型覆盖这些内容,一般来说,这样做时不需要遵循任何特定的语义.只需 Select 对您的类型有意义的内容,以及在某种程度上仍然适合操作员的内容.

如果操作不清楚,最好用一两个词来解释,那么你应该使用标准方法.但在某些情况下,尤其是在处理与数字相关的类型时,可能会有一些类似于数学的操作适合按位运算符,因此可以使用这些操作.

就像只为有意义的操作覆盖标准运算符(如+-)一样,也应该try 对位运算符执行同样的操作.


~~True, ~~False给出(1, 0)的原因是bool类型没有定义自己的__invert__操作.然而,有int人这样做;bool实际上是int的一个亚型.所以bool实际上继承了所有按位和算术运算符的逻辑.这就是为什么True + True == 2等等.

Python-3.x相关问答推荐

Python3和请求-超文本标记语言:试图抓取一个网站-没有取回真正的超文本标记语言代码

循环遍历数据框以提取特定值

将f-字符串放置在f-字符串内

为什么我无法在django中按月筛选事件?

Python-Django 设置 Pandas DataFrame 的多索引不会分组/合并最后一个索引

在Pandas中,根据另一列中的重复值将数据分组为一列

Python (pandas) - 判断一个 df 中的值是否在另一个(不相等)df 中的任何对之间

在一行中读写一个csv文件

在 string.find() 条件下加入两个 Dataframes

如何在 Telethon 中向机器人发送发送表情符号

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

正则表达式来识别用 Python 写成单词的数字?

避免重复连续字符但不包括一个特定字符的正则表达式

为什么 Multiprocessing 的 Lock 不会阻止其他进程使用对象?

python用户输入5个偶数并打印最大的

AttributeError:LinearRegression 对象没有属性coef_

PIL 在图像上绘制半透明方形覆盖

在 WSL (Ubuntu) 中为 python3 安装 venv

为 Python 3 和 PyQt 构建可执行文件

导入父目录进行简要测试