140

今日、Pythonでcaret演算子に出くわし、試してみると、次の出力が得られました。

>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>

それは8に基づいているようです、それで私はある種のバイト操作を推測していますか?フロートに対して奇妙に動作することを除いて、この検索サイトについて多くを見つけることができないようです、誰かがこのオペレーターが行うことへのリンクを持っていますか、またはここでそれを説明できますか?

4

5 に答える 5

219

これはビット単位のXOR(排他的論理和)です。

True引数が異なる場合にのみ評価されます(一方は、、Trueもう一方はFalse)。

実証するために:

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1

あなた自身の例の1つを説明するには:

>>> 8^3
11

このように考えてください:

1000#8(バイナリ)
0011#3(バイナリ)
----#APPLY XOR('垂直')
1011#結果= 11(バイナリ)
于 2010-03-16T00:23:59.790 に答える
47

__xor__()必要に応じてオブジェクトのorメソッドを呼び出します。これは__rxor__()、整数型の場合、ビット単位の排他的論理和を実行します。

于 2010-03-16T00:37:06.480 に答える
14

それはビットごとの排他的論理和です。バイナリビット演算子は、Python言語リファレンスの第5章に記載されています。

于 2010-03-16T00:23:37.210 に答える
9

一般的に、シンボル^はorメソッドのインフィックスバージョンです。シンボルの左右に配置されるデータ型はすべて、互換性のある方法でこの関数を実装する必要があります。整数の場合、これは一般的な操作ですが、たとえば、タイプが次のタイプの関数の組み込み定義はありません。__xor____rxor__XORfloatint

In [12]: 3 ^ 4
Out[12]: 7

In [13]: 3.3 ^ 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-858cc886783d> in <module>()
----> 1 3.3 ^ 4

TypeError: unsupported operand type(s) for ^: 'float' and 'int'

Pythonの優れた点の1つは、独自のクラスでこの動作をオーバーライドできることです。たとえば、一部の言語では、^記号はべき乗を意味します。一例として、この方法でそれを行うことができます。

class Foo(float):
    def __xor__(self, other):
        return self ** other

次に、このようなものが機能します。現在、の場合Fooのみ^記号はべき乗を意味します。

In [16]: x = Foo(3)

In [17]: x
Out[17]: 3.0

In [18]: x ^ 4
Out[18]: 81.0
于 2013-10-18T13:37:07.573 に答える
5

演算子を使用すると^、カーテンの後ろでメソッド__xor__が呼び出されます。

a^bと同等a.__xor__(b)です。

また、は(usingを介して暗黙的に呼び出されたが存在しない場合のフォールバックとして使用されるa ^= b)と同等です。a = a.__ixor__(b)__xor____ixor__^=

原則として、何をするか__xor__は完全にその実装次第です。Pythonの一般的なユースケースは次のとおりです。

  • セットの対称差(2つのセットのうちの1つにすべての要素が存在する)

デモ:

>>> a = {1, 2, 3}
>>> b = {1, 4, 5}
>>> a^b
{2, 3, 4, 5}
>>> a.symmetric_difference(b)
{2, 3, 4, 5}
  • 2つの整数のビットに対してビット単位で等しくない

デモ:

>>> a = 5
>>> b = 6
>>> a^b
3

説明:

    101 (5 decimal)
XOR 110 (6 decimal)
-------------------
    011 (3 decimal)
于 2018-11-19T13:08:28.793 に答える