web-dev-qa-db-ja.com

Pythonのキャレット演算子(^)は何をしますか?

今日pythonでキャレット演算子を見つけて試してみたところ、次の出力が得られました。

>>> 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に基づいているようですので、何らかのバイト操作を推測していますか?この検索サイトについては、フロートに対して奇妙に振る舞う以外はあまり見つけられないようですが、誰かがこの演算子の機能へのリンクを持っていますか、ここで説明できますか?

95
Fry

ビット単位です [〜#〜] xor [〜#〜] (排他的OR)。

one(かつ1つのみ)のオペランド(評価)がtrueの場合、trueになります。

実証するには:

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

独自の例を説明するには:

>>> 8^3
11

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

 1000#8(バイナリ)
 0011#3(バイナリ)
 ----#APPLY XOR( 'vertically')
 1011#結果= 11(バイナリ)
144
ChristopheD

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

ビットごとの排他的ORです。バイナリのビット演算子は Python Language Reference の5章で説明されています。

12
Alex Martelli

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

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 onlyのインスタンスでは、^記号は累乗を意味します。

In [16]: x = Foo(3)

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

In [18]: x ^ 4
Out[18]: 81.0
8
ely