19

私はこの質問を介して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か?

4

6 に答える 6

14

ビット単位の NOT 演算子の標準的な使用例は、ビット単位の AND &、ビット単位の OR |、ビット単位の XOR ^、およびビット単位のシフト<<and と同様に、ビット単位の演算>>です。高レベルのアプリケーションではめったに使用されませんが、ビットごとの操作を行う必要がある場合がまだいくつかあるため、それらが存在します。

もちろん、これらをカスタム型に上書きすることもできます。一般に、その際に特定のセマンティクスに従う必要はありません。あなたのタイプにとって意味のあるものと、オペレーターに何らかの形で適合するものを選択するだけです.

操作が曖昧で、一言か二言で説明したほうがよい場合は、代わりに標準的な方法を使用する必要があります。しかし、特に数値に関連する型を扱う場合、ビット単位の演算子に適合する数学的な操作が行われる可能性があるため、それらを使用しても問題ない場合があります。

+andのような標準演算子を意味のある操作のみに上書きする-のと同じように、ビットごとの演算子についても同じことを試みるべきです。


その理由~~True, ~~False(1, 0)bool型が独自の__invert__操作を定義していないためです。ただし、intそうです。であり、bool実際には のサブタイプですint。したがってbool、実際にはすべてのビット演算子と算術演算子のロジックを継承します。True + True == 2などなどというわけです。

于 2016-07-08T17:02:41.343 に答える
6

この演算子について知っておくべき有効なユースケースの例はありますか? また、あったとしても、int 以外の型に対してこの演算子をオーバーライドすることは一般的に許容されますか?

~通常、楽しいという理由だけで演算子をオーバーロードすることは望ましくありません。読むのが難しくなります。しかし、場合によっては、以外の型に対するこのようなオーバーロードintが理にかなっていることがあります。SQLAlchemy がそれをどのように活用しているかを見てみましょう。

于 2016-07-08T17:01:58.853 に答える
2

この演算子を否定演算子 ( -) と組み合わせて使用​​すると、数値を 1 ずつインクリメントできます。次に例を示します。

x = 5
assert -~x == 6

これは、~演算子を使用した唯一の実用的な方法です。数値以外に使用される他の方法は、一般的にコンテキストに依存し、コードの理解に複雑さのレベルを追加することがよくあります。C++、Swift、Ruby などの言語の場合、この演算子をオーバーロードして、コードをすばやく消化するのが難しい場合があるものを意味するようにすることができます。

于 2016-07-08T17:23:03.613 に答える