擅长:python、mysql、java
<p>按位NOT运算符的标准用例是按位操作,就像按位和<code>&</code>、按位或<code>|</code>、按位异或<code>^</code>、按位移位<code><<</code>和<code>>></code>。虽然它们很少用于更高级别的应用程序,但有时仍需要进行按位操作,所以这就是它们存在的原因。</p>
<p>当然,您可以为自定义类型覆盖这些类型,一般来说,这样做时不需要遵循任何特定的语义。只需选择对您的类型有意义的内容,以及在某种程度上仍然适合操作员的内容。</p>
<p>如果操作不清楚,并且用一两个词更好地解释,则应使用标准方法。但是,在某些情况下,特别是在处理与数字相关的类型时,可能会有一些类似数学的操作适合按位运算符,因此可以使用这些操作。</p>
<p>就像覆盖标准运算符(如<code>+</code>和<code>-</code>)仅用于有意义的操作一样,应该尝试对按位运算符执行相同的操作。</p>
<hr/>
<p><code>~~True, ~~False</code>给出<code>(1, 0)</code>的原因是<code>bool</code>类型没有定义自己的<code>__invert__</code>操作。然而,<code>int</code>确实如此,<code>bool</code>实际上是<code>int</code>的一个子类型。因此<code>bool</code>实际上继承了所有位运算符和算术运算符的逻辑。这就是为什么<code>True + True == 2</code>等</p>